Можно ли построить Java 11 HttpClient, который использует SSL / TLS JAVA_OPTS в качестве своего SSLContext? - PullRequest
0 голосов
/ 26 февраля 2019

Я знаю, что с Apache HttpClientBuilder вы можете позвонить useSystemProperties(), и он создаст клиента с SSLContext, настроенным из javax.net.ssl.keyStore (и хранилищем доверенных сертификатов), если передано как JAVA_OPTS:

try (CloseableHttpClient client = HttpClientBuilder.create().useSystemProperties.build()) {
  // If javax.net.ssl props are set, make requests that require client auth
  // Otherwise make regular requests
}

Я хочу сделать что-то подобное с Java 11 HttpClient.Причина этого в моем случае использования: я считаю хранилища ключей и доверенные хранилища необязательными, и было бы неплохо не проверять их наличие в моем коде.По сути, я хочу установить SSLContext на основе JAVA_OPTS, если они существуют;в противном случае просто используйте "Default" context .

1 Ответ

0 голосов
/ 27 февраля 2019

TLDR: вам не нужно ничего делать

Новый java.net.http.HttpClient, например, более старый HttpsURLConnection, а также обычный SSL[Server]Socket и другие, по умолчанию SSLContext.getDefault(), который по умолчаниюиспользует системные свойства javax.net.ssl.{key,trust}Store* - читая их только один раз, при первом обращении к нему в данной JVM;любые настройки, сделанные после этого (обязательно по коду), игнорируются.

Начальные значения этих системных свойств (как и другие входные данные для JVM, а не автоматически устанавливаются как java.version) могут быть установлены с помощью -D опция в командной строке или в переменной окружения _JAVA_OPTIONS;оба они также могут использоваться для установки других системных свойств, которые не имеют ничего общего с SSL / TLS, и других параметров, которые не являются системными свойствами.Сама Java не использует env var JAVA_OPTS, но некоторые вещи, которые запускают Java как подчиненный (например, мониторы служб, IDE, наборы инструментов и т. Д. И т. Д.), Могут использовать (содержимое) env var какчасть созданной командной строки.

Обратите внимание, что если вы не указываете sysprops, хранилище доверенных сертификатов по умолчанию равно JRE / lib / security / cacerts (которое обычно поставляется со стандартным publicCA, такие как Verisign / Symantec / Digicert, GoDaddy и т. Д.), Но в хранилище ключей нет настроек по умолчанию, т. Е. Не выполняется проверка подлинности клиента.

...