1

HttpClientBuilder我知道你可以调用Apache 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"上下文

4

1 回答 1

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 一起提供),但密钥库没有默认值,即没有进行客户端身份验证。

于 2019-02-26T23:05:52.237 回答