Вдохновленный ответом jlliagre , я сделал свою собственную версию , которая поддерживает номера версий, имеющие только основную версию, заданную . Версия jlliagre будет иметь значение 1 -> 1.2 вместо 2.
Эта версия подходит для обоих стилей номеров версий:
function increment_version()
local VERSION="$1"
local INCREMENTED_VERSION=
if [[ "$VERSION" =~ .*\..* ]]; then
INCREMENTED_VERSION="${VERSION%.*}.$((${VERSION##*.}+1))"
else
INCREMENTED_VERSION="$((${VERSION##*.}+1))"
fi
echo "$INCREMENTED_VERSION"
}
Это приведет к следующим выводам:
increment_version 1 -> 2
increment_version 1.2 -> 1.3
increment_version 1.2.9 -> 1.2.10
increment_version 1.2.9.101 -> 1.2.9.102
SSL может подсказывать клиенту, какой сертификат предоставить. Этот может позволить вам использовать одно хранилище ключей с несколькими идентификаторами в нем, но, к сожалению, большинство серверов не используют эту функцию подсказки. Таким образом, будет более надежным, если вы укажете сертификат клиента, который будет использоваться для каждого соединения.
Вот пример кода для настройки одного SSLContext
с указанными хранилищами идентификаторов и доверенных сертификатов. Вы можете повторить эти шаги, чтобы создать несколько контекстов, по одному для каждого сертификата клиента, который вы хотите использовать. Каждый SSLContext
, вероятно, будет использовать одно и то же хранилище доверенных сертификатов, но другое хранилище удостоверений (содержащее единственную запись ключа клиента, которая будет использоваться в этом контексте).
Инициализируйте контексты, которые вам понадобятся один раз, и повторно используйте правильный для каждого соединения. Если вы устанавливаете несколько подключений, это позволит вам воспользоваться преимуществами сеансов SSL.
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(identityStore, password);
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
Позже вы можете создать сокет напрямую:
SSLSocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, port);
Или, если вы используете класс URL
, вы можно указать SSLSocketFactory
для использования при выполнении запросов HTTPS:
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ctx.getSocketFactory());
Java 6 имеет некоторый дополнительный API, который упрощает настройку сокетов в соответствии с вашими предпочтениями для наборов шифров и т. д.
Здесь есть решение для динамического выбора сертификата клиента, используемого для аутентификации SSL от клиента Axis.