【问题标题】:Does Java Runtimes require use of Keystore for SSL certificates as mandatory?Java 运行时是否需要强制使用 SSL 证书的密钥库?
【发布时间】:2021-03-17 16:48:10
【问题描述】:

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

对于其他各种运行时环境,我似乎可以将它们放在 /etc/ssl/certs 文件夹中: NodeJS => How to add custom certificate authority (CA) to nodejs 去=>Where is Golang picking up root CAs from?

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

【问题讨论】:

  • 是的。 Java 需要一个密钥库。支持多种不同的格式,包括 PKCS#12。
  • Java 不依赖操作系统来处理证书,它有自己的认证根证书列表。它们存储在JRE_HOME/lib/security 文件夹中名为cacerts 的文件中。

标签: java ssl


【解决方案1】:

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

如 cmets 所述,default SSLContext 将从位于 $JRE_HOME/lib/security/cacerts 的 PKCS12(或 JKS)文件中读取证书。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2014-02-24
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2012-03-08
    • 2016-07-10
    相关资源
    最近更新 更多