信任商店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.keyStorejavax.net.ssl.trustStore都用来指定要使用哪个keystore。 密钥库有各种格式,甚至不一定是文件(见这个问题 ),而keytool只是一个工具来执行各种操作(导入/导出/列表/ …)。

javax.net.ssl.keyStorejavax.net.ssl.trustStore参数是用于分别构buildKeyManagerTrustManager的默认参数,然后用于构build一个SSLContext ,该SSLContext本质上包含要在以下情况下使用的SSL / TLS设置通过SSLSocketFactorySSLEngine进行SSL / TLS连接。 这些系统属性就是默认值来自的地方,然后由SSLContext.getDefault()使用,例如SSLSocketFactory.getDefault()使用它本身。 (所有这些都可以通过API在很多地方自定义,如果你不想使用默认值和特定的SSLContext s给定的目的。)

KeyManagerTrustManager之间的区别(以及javax.net.ssl.keyStorejavax.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证书的步骤:

  1. 在Windows中使用keygen命令生成证书:

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

  1. 自我authentication证书:

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

  1. 将证书导出到文件夹:

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

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

keytool -importcert -alias mycert-20161218 -file C:\ certs \ mycert-20161218.cer -keystore .truststore