【问题标题】:Is it possible to build a Java 11 HttpClient that uses SSL/TLS JAVA_OPTS as its SSLContext?是否可以构建一个使用 SSL/TLS JAVA_OPTS 作为其 SSLContext 的 Java 11 HttpClient?
【发布时间】:2019-02-26 19:02:49
【问题描述】:

我知道使用 Apache 的 HttpClientBuilder,您可以调用 useSystemProperties(),如果作为 JAVA_OPTS 传递,它将使用从 javax.net.ssl.keyStore(和信任库)配置的 SSLContext 创建一个客户端:

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 做类似的事情。这样做的原因是在我的用例中,我将密钥存储和信任存储视为可选的,不必在我的代码中检查它们的存在会很好。基本上,我想根据JAVA_OPTS 设置一个SSLContext(如果存在);否则只需使用"Default" context

【问题讨论】:

  • 默认情况下已经发生了这种情况。

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


【解决方案1】:

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,但是 run Java 作为从属的某些东西(如服务监视器、IDE、工具链等)可能会使用该 env var(的内容)作为创建的命令行的一部分。

注意,如果您指定 sysprops,则信任库默认为 JRE/lib/security/cacerts(通常由 Verisign/Symantec/Digicert、GoDaddy 等“标准”公共 CA 提供等),但密钥库没有默认值,即没有进行客户端身份验证。

【讨论】:

  • 是的!我也是这么想的。我的问题实际上是 JAVA_OPTS 需要更改为 _JAVA_OPTIONS 并且我的应用程序将其选中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多