信任库与密钥库-用keytool创建

| 据我了解,密钥库通常会保存私钥/公钥,而信任库通常只保存公钥(并代表您打算与之通信的受信任方的列表)。好吧,这是我的第一个假设,因此,如果这不正确,那么我可能起步并不顺利... 不过,我很想了解使用keytool时如何/何时区分商店。 因此,到目前为止,我已经使用
keytool -import -alias bob -file bob.crt -keystore keystore.ks
这将创建我的keystore.ks文件。我对问题“我信任鲍勃”回答“ 1”,但是我不清楚这是否创建了密钥库文件或信任库文件?我可以将我的应用程序设置为使用该文件。
-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等时有什么关系?     
已邀请:
        这个术语确实有点让人困惑,但是
javax.net.ssl.keyStore
javax.net.ssl.trustStore
都被用于指定出于两个不同目的使用哪个密钥库。密钥库有多种格式,甚至不一定是文件(请参阅此问题),而
keytool
只是对其执行各种操作(导入/导出/列表/ ...)的工具。
javax.net.ssl.keyStore
javax.net.ssl.trustStore
参数是用于分别构建
KeyManager
TrustManager
s的默认参数,然后用于构建
SSLContext
,该基本包含用于通过
SSLSocketFactory
SSLEngine
建立SSL / TLS连接时使用的SSL / TLS设置。这些系统属性正是默认值的来源,然后由ѭ14使用,例如itself15本身使用。 (如果您不想为给定目的使用默认值和特定的ѭ11,则可以在许多地方通过API自定义所有这些内容。)
KeyManager
TrustManager
之间的差异(以及
javax.net.ssl.keyStore
javax.net.ssl.trustStore
之间的差异)如下(引自JSSE参考指南):   TrustManager:确定是否   远程身份验证凭据(和   因此连接)应该是   值得信赖。      KeyManager:确定哪个   要发送到的身份验证凭据   远程主机。 (其他参数可用,并且它们的默认值在JSSE参考指南中进行了描述。请注意,尽管信任存储有一个默认值,但密钥存储没有一个默认值。) 本质上,“ 4”中的密钥库用于包含您的私钥和证书,而“ 5”中的密钥库用于包含当远程方出示证书时您愿意信任的CA证书。在某些情况下,它们可以是一个存储库,并且可以是同一存储库,尽管通常最好的做法是使用不同的存储库(尤其是在基于文件的存储库中)。     
        以常见的用例/目的或外行方式进行解释:   TrustStore:顾名思义,它通常用于存储证书   受信任的实体。流程可以维护所有受信任方的证书存储   它信任。      keyStore:用于存储服务器密钥(公共密钥和私有密钥)   连同签名证书。 在SSL握手期间, 客户端尝试访问https:// 因此,服务器通过提供SSL证书(存储在其keyStore中)进行响应 现在,客户端收到SSL证书并通过trustStore对其进行验证(即,客户端的trustStore已经具有其信任的预定义证书集)。就像:我可以信任此服务器吗?这是我要与之交谈的服务器吗?没有中间人袭击? 一旦客户端验证了它正在与它信任的服务器进行通信,则SSL通信可以通过共享密钥进行。 注意:我在这里没有谈论服务器端的客户端身份验证。如果服务器也要进行客户端身份验证,则服务器还将维护一个trustStore来验证客户端。     
密钥库文件和信任库文件之间没有区别。两者都是专有JKS文件格式的文件。区别在于使用:就我所知,Java仅会使用
-Djavax.net.ssl.trustStore
系统属性引用的存储来创建SSL连接时寻找可信任的证书。键和
-Djavax.net.ssl.keyStore
相同。但是从理论上讲,可以将一个文件和一个文件用于信任库和密钥库。     
        服务器使用密钥库来存储私钥,第三方客户端使用信任库来存储服务器提供的用于访问的公钥。我已经在生产应用程序中做到了这一点。以下是生成用于SSL通信的Java证书的步骤: 在Windows中使用keygen命令生成证书:
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
将证书导入客户端Truststore:
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
    
        这些是使用Keytool在本地计算机上创建信任库的步骤。 在本地计算机中为URL创建信任库的步骤。 1)在浏览器中使用chrome浏览网址 2)检查chrome网址左侧的\“ 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
    
        密钥库只存储私钥,而信任库则存储公钥。您将要生成用于SSL通信的Java证书。您可以在Windows中使用keygen命令,这可能是最简单的解决方案。     
        简单来说: 密钥库用于存储您的凭据(服务器或客户端),而信任库用于存储其他凭据(来自CA的证书)。 在SSL上设置服务器端时,需要密钥库,它用于存储服务器的身份证书,该服务器将在连接上向客户端显示该证书,而客户端上的信任库设置必须包含该密钥才能使连接正常工作。如果浏览器通过SSL连接到任何网站,它将根据服务器的信任库验证服务器提供的证书。     

要回复问题请先登录注册