我们应该将KeyStore和TrustStore指向同一个.jks文件吗?

时间:2014-02-07 16:45:06

标签: java keytool

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

  1. 签名客户证书
  2. 私钥
  3. CA
  4. 我使用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路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法   找到所请求目标的有效证书路径“

    请就此提出建议。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

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签署这些证书。

答案 2 :(得分:0)

对于问题的第一部分,我认为this answer几乎涵盖了它。简而言之,是的,你可以指向同一个文件,不,这不是最佳实践。就您所获得的错误而言,可能会发生许多原因,但您可以尝试将CA添加到JAVA_HOME / jre / lib / security的cacerts文件中。这使它可用于所有JAVA应用程序。