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

时间:2019-02-26 19:02:49

标签: java ssl java-11 java-http-client

我知道使用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

1 个答案:

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