Что такое контекст SSL по умолчанию и сколько контекстов SSL можно настроить?

#java #ssl

Вопрос:

В java у нас есть javax.net.ssl.SSLContext.getDefault (), который описывается следующим образом: Возвращает контекст SSL по умолчанию.

Это заставляет меня задуматься над следующими вопросами:

  1. Когда создается контекст SSL по умолчанию? Происходит ли это только при вызове setDefault(контекст SSLContext)? Как насчет случая, когда мы передаем-Djavax.net.ssl.Хранилище ключей=mykeystore.jks? Создается ли контекст ssl по умолчанию на основе этого хранилища ключей? Также, что происходит в случае серверной среды, такой как Tomcat? Устанавливает ли Tomcat контекст ssl по умолчанию на основе того, что настроено в keystoreFile=»/хранилище ключей/tomcatkeystore.jks?
  2. Когда мы пытаемся использовать любую конечную точку https, используется ли контекст по умолчанию?
  3. При работе с защищенными соединениями, для которых требуется другой набор хранилищ ключей/конфигурация, можем ли мы создавать новые контексты SSL, не влияя на то, что уже настроено для контекста ssl по умолчанию?

Спасибо за вашу помощь.

Ответ №1:

Когда создается контекст SSL по умолчанию? Происходит ли это только при вызове setDefault(контекст SSLContext)?

Нет. Если вы используете setDefault (что IME довольно редко), вам нужно различать два «уровня» по умолчанию:

  • объект, возвращаемый .getDefault — это можно назвать «текущим значением по умолчанию». Он может быть задан, .setDefault в этом случае вы управляете набором объектов и его созданием, или он может быть создан автоматически, см. Далее.
  • объект создается автоматически и внутренне при .getDefault вызове БЕЗ предварительной установки значения. Это можно назвать «созданным по умолчанию», или, может быть, «по умолчанию по умолчанию» (!) После создания этот объект устанавливается по умолчанию, поэтому второй вызов .getDefault возвращается под первым маркером.

Большинство программ не используют .setDefault , поэтому, если они .getDefault вообще используют (чего они могут и не делать), то первый вызов переходит ко второму пуле, а последующие вызовы-к первому.

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

Как насчет случая, когда мы передаем-Djavax.net.ssl.Хранилище ключей=mykeystore.jks? Создается ли контекст ssl по умолчанию на основе этого хранилища ключей?

Во втором пуле-когда вы не устанавливаете значение по умолчанию, а значение по умолчанию создается автоматически, да. Точнее, это «созданное по умолчанию» использует sysprops javax.net.ssl.Хранилище ключей* и …хранилище ключей*, если установлено; если нет, по умолчанию хранилище по умолчанию содержит файл JRE/lib/security/cacerts (или jssecacerts, если он существует, что редко), а хранилище ключей-нет/пусто.

Если вы явно установили значение по умолчанию, вы контролируете, что в нем содержится; вы можете использовать эти системные параметры, если захотите.

Устанавливает ли Tomcat контекст ssl по умолчанию на основе того, что настроено в keystoreFile=»/хранилище ключей/tomcatkeystore.jks?

Нет. Он задает контекст (может быть несколько), используемый для обработки входящих HTTPS-соединений, но это (или это) не контекст по умолчанию.

Когда мы пытаемся использовать любую конечную точку https, используется ли контекст по умолчанию?

Может быть. Есть тысячи способов «потреблять»… https», и все они могут быть разными. Некоторые из них всегда могут использовать контекст по умолчанию; многие иногда будут использовать контекст по умолчанию, а иногда нет; некоторые могут никогда не использовать контекст по умолчанию. Без гораздо более конкретного вопроса сказать это невозможно.

При работе с защищенными соединениями, для которых требуется другой набор хранилищ ключей/конфигурация, можем ли мы создавать новые контексты SSL, не влияя на то, что уже настроено для контекста ssl по умолчанию?

Абсолютно, и это именно то, что вы должны делать. Обратите внимание, что некоторые методы подключения используют SSLContext напрямую, в то время как некоторые (в основном для большей совместимости с подключениями, не связанными с SSL/TLS) используют [SSL]SocketFactory или [SSL]ServerSocketFactory , созданные из и связанные с SSLContext . Они дают тот же результат, но ваш код немного отличается.