信任库vs密钥库-使用keytool创建

我知道密钥存储库通常保存私有/公共密钥,而信任存储库只存储公共密钥(并且表示您打算与之通信的受信任方的列表)。嗯,这是我的第一个假设,所以如果这不是正确的,我可能没有很好地开始……

虽然我有兴趣了解如何/当你使用keytool区分商店。

至此,我已经使用

keytool -import -alias bob -file bob.crt -keystore keystore.ks

它创建了我的密钥存储库。ks文件。我回答yes的问题,我是否信任鲍勃,但我不清楚这是否创建了一个keystore文件或信任库文件?我可以设置我的应用程序使用该文件。

-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"),我可以在受信任的证书下看到证书(但不在keystore部分下)。我正在导入的特定证书只有一个公钥,我打算使用它通过SSL连接向Bob发送内容(但这可能最好留给另一个问题!)。

任何指示或澄清将非常感激。keytool的输出是否与您导入的任何内容相同,只是约定说一个是密钥存储库,另一个是信任存储库?使用SSL等时是什么关系?

286012 次浏览

密钥存储库文件和信任存储库文件之间没有区别。这两个文件都是专有的JKS文件格式。区别在于使用:据我所知,Java只会在创建SSL连接时使用-Djavax.net.ssl.trustStore系统属性引用的存储来查找要信任的证书。key和-Djavax.net.ssl.keyStore也是一样。但是从理论上讲,使用同一个文件进行信任和密钥存储是可以的。

术语确实有点令人困惑,但javax.net.ssl.keyStorejavax.net.ssl.trustStore都用于指定使用哪个密钥库,用于两个不同的目的。密钥存储库有各种格式,甚至不一定是文件(参见这个问题), keytool只是一个对它们执行各种操作的工具(导入/导出/列表/…)。

javax.net.ssl.keyStorejavax.net.ssl.trustStore参数是用于构建__abc2和TrustManagers(分别)的默认参数,然后用于构建SSLContext,其中本质上包含通过SSLSocketFactorySSLEngine建立SSL/TLS连接时使用的SSL/TLS设置。这些系统属性只是默认值的来源,然后由SSLContext.getDefault()使用,例如由SSLSocketFactory.getDefault()使用。(所有这些都可以通过API在许多地方定制,如果你不想为特定目的使用默认值和特定的__abc4。)

KeyManagerTrustManager(以及javax.net.ssl.keyStorejavax.net.ssl.trustStore)之间的区别如下(引用自JSSE参考指南):

TrustManager:确定是否 远程身份验证凭据(和 因此,这种联系)应该是 信任。< / p >

KeyManager:决定哪个 要发送到的身份验证凭据

.

.

(其他参数是可用的,它们的默认值在JSSE参考指南. xml文件中描述。注意,虽然信任存储库有默认值,但密钥存储库没有。)

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

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

  1. windows下使用keygen命令生成证书:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. 自我认证证书:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. 导出证书到文件夹:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. 将证书导入客户端信任库:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore

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

解释:用一般的用法/目的或外行的方式解释:

信任存储库:用于存储证书 信任实体。进程可以维护所有受信任方的证书存储

密钥存储库:用于存储服务器< >强键< / >强(包括公共和私有)

在SSL握手期间,

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

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

  3. 现在,客户端收到SSL证书,并通过trustStore验证它(即客户端信任的trustStore已经有一组预定义的证书)。这就像:我能信任这个服务器吗?这是我要通话的那个服务器吗?没有中间人攻击?

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

注意:我在这里讨论的不是服务器端的客户端身份验证。如果服务器也想进行客户机身份验证,那么服务器还维护一个trustStore来验证客户机。然后它就变成了相互TLS。

以下是使用Keytool在本地机器上创建信任库的步骤。 在本地机器上为URL创建信任库的步骤

1)使用chrome浏览器点击url

2)检查浏览器中url左侧的“我”图标并单击它

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