我知道使用Apache的HttpClientBuilder
可以调用useSystemProperties()
,如果以{{传递,则它将创建一个由SSLContext
(和信任库)配置的javax.net.ssl.keyStore
的客户端1}}:
JAVA_OPTS
我想对Java 11 try (CloseableHttpClient client = HttpClientBuilder.create().useSystemProperties.build()) {
// If javax.net.ssl props are set, make requests that require client auth
// Otherwise make regular requests
}
做类似的事情。这样做的原因是在我的用例中,我将密钥存储区和信任存储区视为可选的,不必在我的代码中检查它们的存在会很好。基本上,我想基于HttpClient
设置一个SSLContext
(如果存在);否则,只需使用"Default"
context。
答案 0 :(得分:4)
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(通常随“标准”公共CA(例如Verisign / Symantec / Digicert,GoDaddy一起提供)提供,等等),但密钥库没有默认值,即未完成客户端身份验证。