繁体   English   中英

Trust Store 与 Key Store - 使用 keytool 创建

[英]Trust Store vs Key Store - creating with keytool

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

不过,我有兴趣了解在使用 keytool 时如何/何时区分商店。

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

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

这会创建我的 keystore.ks 文件。 我对我是否信任鲍勃的问题回答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")后,我可以在受信任的证书下看到证书(但不在密钥库部分)。 我正在导入的特定证书只有一个公钥,我打算用它通过 SSL 连接向 Bob 发送内容(但也许最好留给另一个问题。)。

任何指示或澄清将不胜感激。 无论您导入什么,keytool 的 output 是否都相同,它的约定是一个是密钥库,另一个是信任库? 使用SSL等有什么关系?

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

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

KeyManagerTrustManager之间的区别(以及javax.net.ssl.keyStorejavax.net.ssl.trustStore之间的区别)如下(引自JSSE 参考指南):

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

KeyManager:确定将哪些身份验证凭据发送到远程主机。

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

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

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

TrustStore :用于存储可信实体的证书 进程可以维护它信任的所有受信方的证书存储。

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

在 SSL 次握手过程中,

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

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

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

  4. 一次,客户端验证它正在与它信任的服务器对话,然后 SSL 通信可以通过共享密钥进行。

注意:我在这里不是在谈论服务器端的客户端身份验证。 如果服务器也想进行客户端身份验证,那么服务器也会维护一个 trustStore 来验证客户端。 然后它变成了双向 TLS。

Keystore 是服务器用来存储私钥的,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. 将证书导入客户端信任库:

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

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

这些是使用 Keytool 在本地机器上创建信任库的步骤。 在本地计算机中为 URL 创建信任库的步骤。

1)使用chrome在浏览器中点击url

2)在chrome中查看url左侧的“i”图标并点击

3) 检查证书选项并单击它,将打开一个对话框

4) 检查“证书路径”选项卡中可用于创建信任库的证书数量

5) Go "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

keystore 只存储私钥,而 truststore 存储公钥。 您需要为 SSL 通信生成一个 java 证书。 您可以在 windows 中使用 keygen 命令,这可能是最简单的解决方案。

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

不过,我有兴趣了解使用 keytool 时如何/何时区分商店。

所以,到目前为止,我已经使用

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

它创建了我的 keystore.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") ,我可以在受信任的证书下看到证书(但不在密钥库部分下)。 我要导入的特定证书只有一个公钥,我打算用它通过 SSL 连接向 Bob 发送内容(但也许最好留给另一个问题。)。

任何指示或澄清将不胜感激。 无论您导入什么,keytool 的 output 是否相同,并且它只是约定一个是密钥库,另一个是信任库? 使用SSL等有什么关系?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM