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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以构建使用SSL / TLS JAVA_OPTS作为其SSLContext的Java 11 HttpClient?相关的知识,希望对你有一定的参考价值。

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

答案

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

以上是关于是否可以构建使用SSL / TLS JAVA_OPTS作为其SSLContext的Java 11 HttpClient?的主要内容,如果未能解决你的问题,请参考以下文章

在TLS / SSL握手(证书等)中泄露了哪些信息? [关闭]

AWS,为 RDS 轮换 SSL/TLS 证书

MSBuild 还原给出“请求被中止:无法创建 SSL/TLS 安全通道。”

TLS/SSL 套接字 python 服务器

SSL/TLS通信

FtpWebRequest 使用显式 TLS/SSL