据我所知,密钥库通常包含私钥/公钥,信任存储只包含公钥(并代表您打算与之通信的可信方列表)。嗯,这是我的第一个假设,所以如果这不正确,我可能还没有开始......
我对使用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等时的关系是什么?
答案 0 :(得分:307)
术语确实有点令人困惑,但是javax.net.ssl.keyStore
和javax.net.ssl.trustStore
都用于指定要使用的密钥库,用于两个不同的目的。密钥库有各种格式,甚至不一定是文件(参见this question),而keytool
只是对它们执行各种操作的工具(import / export / list /...)。
javax.net.ssl.keyStore
和javax.net.ssl.trustStore
参数是用于构建KeyManager
和TrustManager
s(分别)的默认参数,然后用于构建SSLContext
它实质上包含通过SSLSocketFactory
或SSLEngine
建立SSL / TLS连接时要使用的SSL / TLS设置。这些系统属性就是默认值的来源,然后由SSLContext.getDefault()
使用,SSLSocketFactory.getDefault()
本身使用它。 (如果您不想为特定目的使用默认值和特定SSLContext
,则可以通过API在多个位置自定义所有这些内容。)
KeyManager
和TrustManager
之间的差异(以及javax.net.ssl.keyStore
和javax.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握手期间,
客户端尝试访问https://
因此,服务器通过提供SSL证书(存储在其keyStore中)进行响应
现在,客户端收到SSL证书并通过trustStore进行验证(即客户端的trustStore已经拥有它信任的预定义证书集)。它像:我可以信任这台服务器吗?这是我试图与之交谈的服务器吗?没有中间人攻击?
一旦客户端验证它正在与它信任的服务器通信,则SSL通信可以通过共享密钥进行。
注意:我在这里不是在谈论服务器端的客户端身份验证。如果服务器也想要进行客户端身份验证,那么服务器还会维护一个trustStore来验证客户端。
答案 2 :(得分:23)
密钥库和信任库文件之间没有区别。两者都是专有JKS文件格式的文件。区别在于使用:据我所知,Java将仅使用javax.net.ssl.trustStore
引用的商店来查找创建SSL连接时要信任的证书。密钥和javax.net.ssl.keyStore
相同。但理论上,对于信任和密钥库使用同一个文件是可以的。
答案 3 :(得分:19)
服务器使用密钥库来存储私钥,第三方客户端使用Truststore来存储服务器提供的公钥访问。我已经在我的生产应用程序中完成了以下是为SSL通信生成Java证书的步骤:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
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命令,这可能是最简单的解决方案。