信任商店vs关键商店 – 使用keytool创build
我知道密钥库通常会保存私钥/公钥和信任存储公钥(并且代表您要与之通信的可信方的列表)。 那么,这是我的第一个假设,所以如果这是不正确的,我可能还没有开始好…
我对使用keytool时如何区分商店感兴趣。
所以,我已经创build了一个密钥库使用
keytool -import -alias bob -file bob.crt -keystore keystore.ks
它创build我的keystore.ks文件。 我回答yes
的问题,我相信鲍勃,但它不知道这是否已经创build了一个密钥库文件或信任库文件? 我可以设置我的应用程序使用该文件。
-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
都用来指定要使用哪个keystore。 密钥库有各种格式,甚至不一定是文件(见这个问题 ),而keytool
只是一个工具来执行各种操作(导入/导出/列表/ …)。
javax.net.ssl.keyStore
和javax.net.ssl.trustStore
参数是用于分别构buildKeyManager
和TrustManager
的默认参数,然后用于构build一个SSLContext
,该SSLContext
本质上包含要在以下情况下使用的SSL / TLS设置通过SSLSocketFactory
或SSLEngine
进行SSL / TLS连接。 这些系统属性就是默认值来自的地方,然后由SSLContext.getDefault()
使用,例如SSLSocketFactory.getDefault()
使用它本身。 (所有这些都可以通过API在很多地方自定义,如果你不想使用默认值和特定的SSLContext
s给定的目的。)
KeyManager
和TrustManager
之间的区别(以及javax.net.ssl.keyStore
和javax.net.ssl.trustStore
之间的区别)如下(引用JSSE参考指南 ):
TrustManager:确定是否应该信任远程authentication凭证(以及连接)。
KeyManager:确定发送给远程主机的authentication凭证。
(其他参数可用,其默认值在JSSE参考指南中有描述。请注意,尽pipe信任库有一个默认值,但密钥库没有一个。
本质上, javax.net.ssl.keyStore
的密钥库旨在包含您的私钥和证书,而javax.net.ssl.trustStore
旨在包含您愿意信任的远程方提供的CA证书证书。 在某些情况下,它们可以是同一个商店,但是使用不同的商店通常是更好的做法(特别是当它们是基于文件的时候)。
密钥库和信任库文件没有区别。 两者都是专有的JKS文件格式的文件。 区别在于:据我所知,Java只会使用javax.net.ssl.trustStore
引用的存储来查找在创buildSSL连接时要信任的证书。 键和javax.net.ssl.keyStore
。 但是从理论上讲,使用同一个文件进行信任和密钥库是很好的。
密钥库被服务器用来存储私钥,信任库被第三方客户端用来存储服务器提供的公钥来访问。 我已经在我的生产应用程序中这样做了。 以下是为SSL通信生成Java证书的步骤:
- 在Windows中使用keygen命令生成证书:
keytool -genkey -keystore server.keystore -alias mycert-20161109 -keyalg RSA -keysize 2048 -validity 3950
- 自我authentication证书:
keytool -selfcert -alias mycert-20161109 -keystore server.keystore -validity 3950
- 将证书导出到文件夹:
keytool -export -alias mycert-20161109 -keystore server.keystore -rfc -file mycert-20161109.cer
- 将证书导入到客户端信任库:
keytool -importcert -alias mycert-20161218 -file C:\ certs \ mycert-20161218.cer -keystore .truststore