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

问题描述 投票:0回答:1

我知道使用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做类似的事情。原因在于我的用例,我将密钥存储区和信任存储区视为可选项,并且不必在我的代码中检查它们的存在就好了。基本上,我想设置一个基于SSLContextJAVA_OPTS,如果它们存在的话;否则只需使用"Default" context

java ssl java-11 java-http-client
1个回答
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,则truststore默认为JRE / lib / security / cacerts(通常由“标准”公共CA提供,如Verisign / Symantec / Digicert,GoDaddy等),但密钥库没有默认值,即没有进行客户端身份验证。

© www.soinside.com 2019 - 2024. All rights reserved.