Trust Store与Key Store - 使用keytool创建

时间:2011-06-14 08:23:14

标签: java ssl keytool jce

据我所知,密钥库通常包含私钥/公钥,信任存储只包含公钥(并代表您打算与之通信的可信方列表)。嗯,这是我的第一个假设,所以如果这不正确,我可能还没有开始......

我对使用keytool时如何/何时区分商店感兴趣。

所以,到目前为止,我已经使用

创建了一个密钥库
keytool -import -alias bob -file bob.crt -keystore keystore.ks

创建我的keystore.ks文件。我回答yes问题我信任bob但是我不清楚这是否创建了密钥库文件或信任库文件?我可以将我的应用程序设置为使用该文件。

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

并设置System.setProperty( "javax.net.debug", "ssl"),我可以在受信任的认证下看到证书(但不在密钥库部分下)。我导入的特定证书只有一个公钥,我打算用它通过SSL连接向Bob发送内容(但也许最好留给另一个问题!)。

任何指示或澄清将非常感激。无论你导入什么,keytool的输出都是相同的,它的惯例是一个是密钥库而另一个是信任存储?使用SSL等时的关系是什么?

7 个答案:

答案 0 :(得分:307)

术语确实有点令人困惑,但是javax.net.ssl.keyStorejavax.net.ssl.trustStore都用于指定要使用的密钥库,用于两个不同的目的。密钥库有各种格式,甚至不一定是文件(参见this question),而keytool只是对它们执行各种操作的工具(import / export / list /...)。

javax.net.ssl.keyStorejavax.net.ssl.trustStore参数是用于构建KeyManagerTrustManager s(分别)的默认参数,然后用于构建SSLContext它实质上包含通过SSLSocketFactorySSLEngine建立SSL / TLS连接时要使用的SSL / TLS设置。这些系统属性就是默认值的来源,然后由SSLContext.getDefault()使用,SSLSocketFactory.getDefault()本身使用它。 (如果您不想为特定目的使用默认值和特定SSLContext,则可以通过API在多个位置自定义所有这些内容。)

KeyManagerTrustManager之间的差异(以及javax.net.ssl.keyStorejavax.net.ssl.trustStore之间的差异)如下(引自JSSE ref guide):

  

TrustManager:确定是否   远程身份验证凭据(和   因此,连接)应该是   可信的。

     

KeyManager:确定哪个   要发送到的身份验证凭据   远程主机。

(其他参数可用,其默认值在JSSE ref guide中描述。请注意,虽然信任库存在默认值,但密钥库中没有一个。)

基本上,javax.net.ssl.keyStore中的密钥库旨在包含您的私钥和证书,而javax.net.ssl.trustStore旨在包含您在远程方提供其证书时愿意信任的CA证书。在某些情况下,它们可以是同一个商店,尽管使用不同的商店通常更好(特别是当它们是基于文件的时候)。

答案 1 :(得分:36)

以常用用法/目的或外行方式解释:

  

TrustStore :如名称所示,它通常用于存储证书   可信实体进程可以维护其所有可信方的证书存储   它信任的。

     

keyStore :用于存储服务器密钥(公共和私有)   以及签署的证书。

在SSL握手期间,

  1. 客户端尝试访问https://

  2. 因此,服务器通过提供SSL证书(存储在其keyStore中)进行响应

  3. 现在,客户端收到SSL证书并通过trustStore进行验证(即客户端的trustStore已经拥有它信任的预定义证书集)。它像:我可以信任这台服务器吗?这是我试图与之交谈的服务器吗?没有中间人攻击?

  4. 一旦客户端验证它正在与它信任的服务器通信,则SSL通信可以通过共享密钥进行。

  5. 注意:我在这里不是在谈论服务器端的客户端身份验证。如果服务器也想要进行客户端身份验证,那么服务器还会维护一个trustStore来验证客户端。

答案 2 :(得分:23)

密钥库和信任库文件之间没有区别。两者都是专有JKS文件格式的文件。区别在于使用:据我所知,Java将仅使用javax.net.ssl.trustStore引用的商店来查找创建SSL连接时要信任的证书。密钥和javax.net.ssl.keyStore相同。但理论上,对于信任和密钥库使用同一个文件是可以的。

答案 3 :(得分:19)

服务器使用密钥库来存储私钥,第三方客户端使用Truststore来存储服务器提供的公钥访问。我已经在我的生产应用程序中完成了以下是为SSL通信生成Java证书的步骤:

  1. 在Windows中使用keygen命令生成证书:
  2. keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

    1. 自我证明证书:
    2. keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

      1. 将证书导出到文件夹:
      2. keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

        1. 将证书导入客户端Truststore:
        2. keytool -importcert -alias mycert -file mycert.cer -keystore truststore

答案 4 :(得分:0)

这些是使用Keytool在本地计算机上创建信任库的步骤。 在本地计算机上为URL创建信任库的步骤。

1)使用chrome在浏览器中点击网址

2)检查镶边中网址左侧的“ i” 图标,然后单击它

3)检查证书选项,然后单击它,将打开一个对话框

4)检查“证书路径”标签,了解可用于创建信任库的证书数量

5)转到您要创建的"details" tab -> click"Copy to File" -> Give the path and the name for the certificate

6)检查它是否具有父证书,并遵循点“ 5”

7)在创建所有证书之后,打开“命令提示符”,然后导航到创建证书的路径。

8)提供以下Keytool命令以添加证书并创建信任库。

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9)提供所有证书的keytool命令,并将它们添加到信任库中。

    keytool -list -v -keystore cacerts

答案 5 :(得分:-1)

最简单的说法:

密钥库用于存储您的凭据(服务器或客户端),而 truststore 用于存储其他凭据(来自CA的证书)。

在SSL上设置服务器端时需要密钥库,该密钥库用于存储服务器的身份证书,该服务器将在连接上向客户端显示该服务器,而客户端上的信任库设置必须包含该密钥才能使连接正常工作。如果您浏览器通过SSL连接到任何网站,它将根据服务器的信任库验证服务器提供的证书。

答案 6 :(得分:-2)

密钥库只存储私钥,而信任库存储公钥。您将需要为SSL通信生成Java证书。您可以在Windows中使用keygen命令,这可能是最简单的解决方案。