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

I was interested though in understanding how / when you distinguish the stores when using keytool.

到目前为止,我已经使用

keytool -import -alias bob -file bob.crt -keystore keystore.ks

这就创建了我的密钥库.ks文件.我对我是否信任bob这个问题回答yes,但我不清楚这是否创建了密钥库文件或信任库文件?我可以将我的应用程序设置为使用该文件.

-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")后,我可以在Trusted Certiments下(但不在KeyStore部分下)看到证书.我要导入的特定证书只有一个公钥,我打算使用它通过SSL连接将内容发送给Bob(但这最好留给另一个问题!)

如有任何提示或澄清,将不胜感激.keytool的输出是否与您导入的内容相同,以及它的唯一约定,即一个是密钥库,另一个是信任存储?使用SSL等时有什么关系?

推荐答案

术语确实有点混乱,但是javax.net.ssl.keyStorejavax.net.ssl.trustStore都用来指定要使用哪些密钥库,用于两个不同的目的.密钥库有多种格式,甚至不一定是文件(参见this question),而keytool只是对其执行各种操作的工具(导入/导出/列表/.).

javax.net.ssl.keyStorejavax.net.ssl.trustStore参数分别是用于构建KeyManagerTrustManager的默认参数,然后用于构建SSLContext,该SSLContext实质上包含通过SSLSocketFactorySSLEngine建立SSL/TLS连接时要使用的SSL/TLS设置.这些系统属性就是默认值的来源,然后由SSLContext.getDefault()使用,例如由SSLSocketFactory.getDefault()本身使用.(如果您不想将默认值和特定的SSLContext用于给定的目的,则可以在许多地方通过API自定义所有这些内容.)

KeyManagerTrustManager(javax.net.ssl.keyStorejavax.net.ssl.trustStore)之间的差异如下(引用自JSSE ref guide):

TrustManager:确定是否 远程身份验证凭据(和 因此,连接)应该是 值得信任.

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

(其他参数可用,其默认值在JSSE ref guide中有描述.请注意,虽然信任存储有默认值,但密钥存储没有默认值.)

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

Java相关问答推荐

通过推送通知向自己发送Matrix消息

如果给定层次 struct 级别,如何从其预序穿越构造n元树

Android视图覆盖不阻止点击它后面的控件

如何在返回bigint []值的子查询中使用any?

在for—each循环中的AnimationTimer中的if语句'

Spark上下文在向Spark提交数据集时具有内容,但Spark在实际构建它时发现它为空

为什么JAVA&S清洁器使用链表而不是并发HashSet?

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

放气总是压缩整个街区吗?

在Spring Boot中使用哪个Java类来存储创建时间戳?

为什么Java编译器不区分不同类型的方法?

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

如何仅使用键/ID的一部分(组合)高效地返回映射值?

二进制数据的未知编码/序列化

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

没有Tomcat,IntelliJ如何在本地运行API?

控制器建议异常处理

多线程、并发和睡眠未按预期工作

如何使用我的RLE程序解决此问题

SonarQube在合并升级到java17后对旧代码提出错误