Trust Store与Key Store - 使用keytool创建

Tob*_*oby 239 java ssl jce keytool

我知道密钥库通常会保存私钥/公钥,信任存储只保存公钥(并代表您打算与之通信的可信方列表).嗯,这是我的第一个假设,所以如果这不正确,我可能还没有开始......

我对使用keytool时如何/何时区分商店感兴趣.

所以,到目前为止,我已经创建了一个密钥库

keytool -import -alias bob -file bob.crt -keystore keystore.ks
Run Code Online (Sandbox Code Playgroud)

这将创建我的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
Run Code Online (Sandbox Code Playgroud)

并且使用System.setProperty( "javax.net.debug", "ssl")set,我可以在受信任的证书下看到证书(但不在密钥库部分下).我导入的特定证书只有一个公钥,我打算用它通过SSL连接向Bob发送内容(但也许最好留给另一个问题!).

任何指示或澄清都将非常感激.无论你导入什么,keytool的输出都是相同的,它的惯例是一个是密钥库而另一个是信任存储?使用SSL等时的关系是什么?

Bru*_*uno 324

该术语是有点混乱确实,但两者javax.net.ssl.keyStorejavax.net.ssl.trustStore用来指定密钥库使用,用于两个不同的目的.密钥库有各种格式,甚至不一定是文件(请参阅此问题),并且keytool只是对它们执行各种操作的工具(导入/导出/列表/ ...).

javax.net.ssl.keyStorejavax.net.ssl.trustStore参数是用于建立默认参数KeyManagerS和TrustManagerS(分别地),然后用于构建SSLContext其基本上包含SSL /使经由一个SSL/TLS连接时TLS设置,以使用SSLSocketFactorySSLEngine.这些系统属性就是默认值来自的位置,然后由其SSLContext.getDefault()自身使用SSLSocketFactory.getDefault(),例如.(如果您不想使用默认值和特定SSLContext用途的s ,那么所有这些都可以通过API在多个地方进行自定义.)

的之间的差KeyManagerTrustManager(并因此之间javax.net.ssl.keyStorejavax.net.ssl.trustStore)如下(从引JSSE REF指南):

TrustManager:确定是否应该信任远程身份验证凭据(以及连接).

KeyManager:确定要发送到远程主机的身份验证凭据.

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

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

  • 您不需要指定信任库,因为它有一个默认值(它与JRE捆绑在一起),通常在`$ JAVA_HOME/lib/security/cacerts`中(参见我发送的第二个JSSE参考指南链接).与浏览器一样,它包含一组默认的可信CA证书.通常,客户端将始终使用信任库来检查服务器证书,但只有在服务器请求客户端证书时才会使用密钥库,并且服务器将始终使用密钥库来获取其自己的密钥+证书,但信任库仅用于如果客户端发送客户端证书,则使用 (53认同)
  • 感谢您提供有用的信息 在Weblogic中,有"identity-key-store"存储服务器的SSL证书,然后有"trust-key-store"存储服务器信任的SSL证书,所以如果我说"身份密钥",我是否正确-store"只是一个"密钥库"而"trust-key-store"只不过是一个"信任库"? (2认同)

Bal*_*yan 50

以常见用例/目的或外行方式解释:

TrustStore:如名称所示,它通常用于存储可信实体的证书.进程可以维护其信任的所有可信任方的证书存储.

keyStore:用于存储服务器密钥(公共和私有)以及签名证书.

在SSL握手期间,

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

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

  3. 现在,客户端收到SSL证书并通过trustStore进行验证(即客户端的trustStore已经拥有它信任的预定义证书集).它像:我可以信任这台服务器吗?这是我试图与之交谈的服务器吗?没有中间人攻击?

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

注意:我在这里不是在谈论服务器端的客户端身份验证.如果服务器也想要进行客户端身份验证,那么服务器还会维护一个trustStore来验证客户端.


mus*_*iKk 24

密钥库和信任库文件之间没有区别.两者都是专有JKS文件格式的文件.区别在于使用:据我所知,Java将仅使用引用的商店-Djavax.net.ssl.trustStore在创建SSL连接时查找要信任的证书.键和键相同-Djavax.net.ssl.keyStore.但理论上,对于信任和密钥库使用同一个文件是可以的.

  • 您可以通过设置`javax.net.ssl.keyStoreType`和`javax.net.ssl.trustStoreType`系统属性来使用不同类型的密钥库(例如,PKCS12). (4认同)
  • 密钥库格式取决于可用的提供程序(请参阅[此列表](http://download.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html)与Oracle JRE捆绑的用户默认).[问题]中也有讨论(http://stackoverflow.com/questions/6157550/question-on-java-keystores/6157716#6157716).其他提供商(例如BouncyCastle)可用于其他格式. (2认同)

Aka*_*288 21

密钥库由服务器用于存储私钥,第三方客户端使用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. 将证书导入客户端Truststore:

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