Используя несколько клиентских сертификатов SSL в Java с тем же хостом

Вдохновленный ответом 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

7
задан Community 23 May 2017 в 10:30
поделиться

2 ответа

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, который упрощает настройку сокетов в соответствии с вашими предпочтениями для наборов шифров и т. д.

12
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: