如何使用自签名证书创建密钥库和信任库?

Posted

技术标签:

【中文标题】如何使用自签名证书创建密钥库和信任库?【英文标题】:How to create keystore and truststore using self-signed certificate? 【发布时间】:2017-07-12 21:46:02 【问题描述】:

我们有 JAVA 服务器和客户端使用 SSL 通过网络进行通信。服务器和客户端使用证书相互验证。服务器和客户端使用的密钥库类型是 JKS。服务器和客户端的密钥库和信任库文件名是:server.keystore、server.truststore、client.keystore 和 client.truststore。

我使用自签名证书仅用于测试。

问题:

第一季度。我想知道为什么我需要在第 6 步中将服务器和客户端自己的证书添加到各自的信任库中。

第二季度。我可以减少步骤数来实现相同的目标吗?如果是,那么如何?

为服务器创建 RSA 密钥、自签名证书、密钥库和信任库的步骤

1.生成 RSA 私钥

openssl genrsa -out diagserverCA.key 2048

2。创建 x509 证书

openssl req -x509 -new -nodes -key diagserverCA.key -sha256 -days 1024 -out diagserverCA.pem

3.从私钥和公共证书创建 PKCS12 密钥库。

openssl pkcs12 -export -name server-cert -in diagserverCA.pem -inkey diagserverCA.key -out serverkeystore.p12

4.将 PKCS12 密钥库转换为 JKS 密钥库

keytool -importkeystore -destkeystore server.keystore -srckeystore serverkeystore.p12 -srcstoretype pkcs12 -alias server-cert

5.将客户端的证书导入服务器的信任库。

keytool -import -alias client-cert -file diagclientCA.pem -keystore server.truststore

6.将服务器的证书导入服务器的信任库。

keytool -import -alias server-cert -file diagserverCA.pem -keystore server.truststore

为客户端创建 RSA 私钥、自签名证书、密钥库和信任库的步骤

1.生成私钥

openssl genrsa -out diagclientCA.key 2048

2。创建 x509 证书

openssl req -x509 -new -nodes -key diagclientCA.key -sha256 -days 1024 -out diagclientCA.pem

3.从私钥和公共证书创建 PKCS12 密钥库。

openssl pkcs12 -export -name client-cert -in diagclientCA.pem -inkey diagclientCA.key -out clientkeystore.p12

4.将 PKCS12 密钥库转换为 JKS 密钥库

keytool -importkeystore -destkeystore client.keystore -srckeystore clientkeystore.p12 -srcstoretype pkcs12 -alias client-cert

5.将服务器的证书导入客户端的信任库。

keytool -import -alias server-cert -file diagserverCA.pem -keystore client.truststore

6.将客户的证书导入客户的信任库。

keytool -import -alias client-cert -file diagclientCA.pem -keystore client.truststore

【问题讨论】:

Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops? 另见Keytool create a trusted self signed certificate。 【参考方案1】:

第一季度。我想知道为什么我需要在第 6 步中将服务器和客户端自己的证书添加到各自的信任库中。

你没有。您将服务器和客户端证书添加到彼此的 信任库中。服务器和客户端不需要信任自己的证书,但他们确实需要相互信任。

第二季度。我可以减少步骤数来实现相同的目标吗?如果是,那么如何?

您可以使用keytool 完成所有操作。大量记录在案的示例。你根本不需要使用openssl

评论:

在第一部分中,第 5 步和第 6 步都是错误的。应该有一个步骤:将服务器的证书导出到客户端的信任库。 同样,在第二部分中,第 5 步和第 6 步又错了,再次应该只有一步:将客户端的证书导出到服务器的密钥库。 也就是说,两个step 5s应该互换,两个step 6s删除。

您将在 JDK 文档的 JSSE Reference Guide 中找到正确的操作说明。每个步骤大约三步。但它真正表明的是,自签名证书真的不值得印在上面的纸上。获取 CA 签名的证书。更多价值且更易于部署(无需导出步骤)。

你从哪里弄来的这些垃圾?

【讨论】:

我正在使用自签名,因为它用于测试环境。在搜索互联网后,我遇到了这种垃圾。我对此很陌生,仍然对这个主题感到困惑。我将研究 keytool 解决方案。我相信列出的步骤都没有签署过证书。 @vic99 我问你是从哪里想到的,“互联网”不是一个充分的答案。请提供适当的引用。步骤 2 创建自签名证书。但是后续步骤不能正确处理它。 请向我解释第 2 步的哪一部分负责签署证书。 -x509 部分就是这样做的。 FWIW OP 可以通过用 openssl req -new -x509 -newkey rsa:2048 -keyout keyfile -nodes ... 替换 openssl genrsa -out keyfile 2048; openssl req -new -x509 -key keyfile ... 来节省另一个步骤,这两个部分都可以。此外,实际上可能没有必要将 OpenSSL 的 P12 转换为 JKS,因为至少从 2004 年开始,Java 加密就可以很好地处理 P12。也就是说,我同意使用 keytool,实际的 CA 更好。【参考方案2】:

第一季度。我想知道为什么我需要在第 6 步中将服务器和客户端自己的证书添加到各自的信任库中。

A1。如果您不使用通用证书颁发机构来签署您的客户端和服务器证书......将每个证书添加到信任库是唯一的方法。然而... 即使在测试环境中,您也可以创建自己的证书颁发机构并使用它来签署您创建的客户端和服务器证书。然后,您的信任库只需要包含您的证书颁发机构的公钥。

第二季度。我可以减少步骤数来实现相同的目标吗?如果是,那么如何?

A2。是的,使用通用证书来签署您的客户端和服务器证书。

查看this post 中的脚本,逐步了解如何创建您自己的 CA 并使用它来签署服务器和客户端证书。它还会创建您的信任库...

希望这会有所帮助。

最好的,王牌

【讨论】:

Q1 的答案是你不知道,这暴露了 OP 的根本误解,而你自己的答案似乎也表现出同样的误解。

以上是关于如何使用自签名证书创建密钥库和信任库?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自签名证书正确导入默认情况下可供所有 Java 应用程序使用的 Java 密钥库?

如何从自签名证书的密钥库中导出私钥

在 Windows 7 上信任 Java 7 的自签名证书

将自签名证书链添加到密钥库

密钥保管库上的 Azure 自签名证书

自签名证书颁发及验证