Java 运行时是否强制要求使用 SSL 证书的密钥库?

Rub*_*ans 5 java ssl

我想了解 Java 运行时对 SSL 证书存储的一般要求。我知道它可以复制到主机的 /etc/ssl/certs 文件夹,但对于 Java,是否需要导入到特定的密钥库以便运行时能够在应用程序的任何 SSL 验证过程中使用和使用?例如,如果我有一个 JRE 客户端,需要打包根/中间证书以使 Web 客户端内部连接到 site1.foo.com,我将需要依赖于链的根证书和中间证书来验证请求。

对于各种其他运行时环境,似乎我可以将它们放在 /etc/ssl/certs 文件夹中: NodeJS =>如何将自定义证书颁发机构(CA)添加到 Nodejs Go => Golang 从哪里获取根 CA?

但是,大概为了在 Java 中使用,我需要采取额外的步骤并使用 keytool 并导入到特定的密钥库中?据推测,它不能像上面那样从公共目录中获取?希望我的问题有意义。

Pio*_*asz 3

在 Java 中,通常通过接口访问证书集合KeyStore

正如评论中所述,默认情况 SSLContext下将从位于 的 PKCS12(或 JKS)文件中读取证书$JRE_HOME/lib/security/cacerts

然而,这不是唯一的可能性,您不必调用keytool来添加受信任的证书:

  • 在 Debianoids 上,您可以使用-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts(参见此问题)来使用软件包提供的 PKCS12 文件ca-certificates-java。只要您致电,它就会更新update-ca-certificates。因此,您只需添加一个*.crt文件/usr/local/share/ca-certificates并运行即可update-ca-certificates

  • 如果您不使用默认值,SSLContext您可以使用不同的值来初始化它TrustManager(参见这个问题)。这就是 Tomcat 8.5+ 加载 PEM 格式证书的方式。

不幸的是,没有KeyStore从目录读取证书的实现,但可以轻松编写。

编辑:在 Debianoids 上,打包的 JRE 已经使用/etc/ssl/java/cacerts,因此不需要进一步配置。