我们是否应该将密钥库和信任库指向同一个 .jks 文件?

2022-09-04 21:58:01

我正在使用 SSL 握手来连接到 URL。为此,我生成了一个.csr文件并对其进行了签名。签名后,我创建了一个包含3个条目的my.jks文件

  1. 已签名的客户端证书
  2. 私钥
  3. 加州

我使用jetty作为服务器,并且我专门将密钥库和信任库设置为相同的jks文件,如下所示

-Djavax.net.ssl.keyStore=/home/keystore/my.jks
-Djavax.net.ssl.keyStorePassword=changeit
-Djavax.net.ssl.trustStore=/home/keystore/my.jks
-Djavax.net.ssl.trustStorePassword=changeit

它工作正常。但这是正确的方法吗?我认为密钥库应包含客户机证书和私钥,而信任库应包含 CA。但是当我尝试这样做时,我得到以下错误。

“javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 无法找到有效证书路径到请求的目标”

请就此提供建议。


答案 1

不可以。信任库只包含公共数据:您信任的 CA 的公共证书。密钥库包含私钥及其证书:您的数字身份。他们甚至可能被不同的人控制。不要混淆它们的功能。


答案 2

如果要对证书进行自签名(仅当您将使用它进行服务器内部通信而不交换任何个人/敏感信息时):

1) 使用 -certreq 生成 CSR

keytool -certreq -alias keyAlias -keystore locationPk -storepass yourpass -file myowncertrequest.csr

2) 使用上述 csr 生成证书:

keytool -gencert -infile myowncertrequest.csr -alias keyAlias -keystore locationPk -storepass yourpass -outfile myownsignedcert.cer

3) 将其导入“单独”信任存储

keytool -import -trustcacerts -alias myown -file myownsignedcert.cer -keystore intra_server_truststore -storepass goodpassword

这将创建一个自定义信任存储,该存储仅在您自己的域内使用,并用于一些基本的身份验证和数据交换。但是,如果将服务暴露给外部世界,请务必使用适当的 CA 对这些证书进行签名。


推荐