Установка Java SSLContext по умолчанию из ресурса во время выполнения - PullRequest
4 голосов
/ 07 января 2012

Основные компоненты моего вопроса (контекст следует за фрагментом кода)

  1. Является ли следующий код допустимой альтернативой установке хранилища ключей Java по умолчанию через -Djavax.net.ssl.keystore?
  2. Какое влияние, кроме изменения ключа по умолчанию и диспетчера доверия, может иметь этот код на поведение SSL в уязвимой JVM
  3. Есть ли лучшая альтернатива установке доверия по умолчанию/ key сохраняет во время выполнения из ресурса?

    KeyStore ks = KeyStore.getInstance("JKS");
    ks.load(testService.class.getClassLoader().getResourceAsStream("resources/.keystore"), "changeit".toCharArray());
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ks);
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(ks, "changeit".toCharArray());
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    SSLContext.setDefault(ctx); 
    

Контекст, окружающий этот вопрос, следующий.В настоящее время я разрабатываю клиент CXF для веб-службы с взаимной аутентификацией сертификата.По разным причинам добавление клиентского сертификата и ключа в хранилище ключей по умолчанию нежелательно.В идеале я искал способ включить хранилище ключей в качестве файла ресурсов в JAR и установить его по умолчанию во время выполнения по мере необходимости.Я также хотел избежать настройки каждого клиента и / или соединения для каждого объекта, а также поддерживать работу таких вещей, как JaxWsDynamicClientFactory (в основном ради «полноты»).

Я искал в Интернетеи SO для соответствующего материала и нашел эти ( один , два ) связанные вопросы, но ни одно из предложенных решений не было именно тем, что я искал (хотя я использовал их как трамплинразработать приведенный выше код).

Теперь я понимаю, что другие решения могут быть выполнены для работы, но я специально искал решение, которое отвечало бы всем этим требованиям.

1 Ответ

5 голосов
/ 07 января 2012

Ваш код будет использовать то же хранилище ключей (загруженное из загрузчика классов), что и хранилище ключей по умолчанию и хранилище доверия по умолчанию. Это фактически эквивалентно установке -Djavax.net.ssl.keystore* и -Djavax.net.ssl.truststore* с одним и тем же значением.

Это хорошо, если ты так хочешь. (Вы можете захотеть закрыть InputStream после загрузки хранилища ключей.)

Это повлияет на всю JVM и на все, что использует SSLContext.getDefault(), в частности на все, что основано на SSLSocketFactory (URLConnection и т. Д.) По умолчанию.

Поскольку это будет ваше хранилище доверенных сертификатов по умолчанию, сертификаты доверенных сертификатов по умолчанию от основных СА не будут храниться в вашем хранилище доверенных сертификатов, если вы не импортируете их явно в копию, загружаемую из загрузчика классов.

Предположительно, у вас не будет большого количества новых сертификатов CA (или самозаверяющих), которым можно доверять. Возможно, было бы удобнее разделять хранилище ключей и хранилище доверенных сертификатов, поскольку хранилище доверенных сертификатов может быть общим для большинства ваших клиентов, и обычно это будет просто одноразовый шаг настройки в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...