是否可以构建一个使用 SSL/TLS JAVA_OPTS 作为其 SSLContext 的 Java 11 HttpClient?

hee*_*eez 1 java ssl java-http-client java-11

我知道HttpClientBuilder您可以使用 Apache调用useSystemProperties(),如果传递为,它将创建一个SSLContextjavax.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
}
Run Code Online (Sandbox Code Playgroud)

我想用 Java 11 做一些类似的事情HttpClient。这样做的原因是在我的用例中,我将密钥存储和信任存储视为可选的,并且不必在我的代码中检查它们的存在会很好。基本上,我想SSLContext根据JAVA_OPTS它们是否存在来设置;否则只使用"Default"上下文

dav*_*085 5

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(通常随 Verisign/Symantec/Digicert、GoDaddy 等“标准”公共 CA 提供),但密钥库没有默认值,即没有完成客户端身份验证。