我知道使用Apache的HttpClientBuilder
你可以调用useSystemProperties()
,如果传递给SSLContext
,它将创建一个javax.net.ssl.keyStore
(和truststore)配置的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。
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,则truststore默认为JRE / lib / security / cacerts(通常由“标准”公共CA提供,如Verisign / Symantec / Digicert,GoDaddy等),但密钥库没有默认值,即没有进行客户端身份验证。