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

11
我们有一个JAVA服务器和客户端使用SSL通过网络通信。服务器和客户端使用证书相互验证。服务器和客户端使用的密钥库类型是JKS。服务器和客户端的密钥库和信任库文件名分别为:server.keystore、server.truststore、client.keystore和client.truststore。
我仅使用自签名证书进行测试。
问题:
Q1.我想知道为什么我需要在步骤6中将服务器和客户端各自的证书添加到其相应的信任库中。
Q2.我是否可以减少达到相同目的所需的步骤?如果可以,那么如何做?
创建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命令将客户端keystore.p12导入到目标客户端密钥库client.keystore中。

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

使用keytool命令将diagserverCA.pem文件中的服务器证书导入到客户端信任库client.truststore中,并指定别名为server-cert。

6. 将客户端证书导入到客户端信任库中。

使用keytool命令将diagclientCA.pem文件中的客户端证书导入到客户端信任库client.truststore中,并指定别名为client-cert。


Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。另请参阅我应该在哪里发布有关Dev Ops的问题? - jww
2个回答

3

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

其实不需要。您需要将服务器和客户端证书添加到彼此的信任库中。服务器和客户端不需要信任自己的证书,但它们需要信任彼此的证书。

Q2. 我可以减少步骤来实现同样的效果吗?如果可以,那应该怎么做?

您可以使用 keytool 完成整个过程。有很多相关的文档示例。完全不需要使用 openssl

批评:

  • 在第一部分中,步骤5和6都是错误的。应只有一个步骤:将服务器的证书导出到客户端的信任库中。
  • 类似地,在第二部分中,步骤5和6也都是错误的,应该只有一个步骤:将客户端的证书导出到服务器的密钥库中。
  • 换句话说,两个步骤5应该交换位置,然后删除两个步骤6。

您可以在JDK文档中的JSSE参考指南中找到正确的操作说明。每部分大约只有三个步骤。但这仅仅是说明自签名证书真的一文不值。获取CA签名的证书更有价值,而且部署起来更容易(无需导出步骤)。

您从哪里得到这些垃圾信息的呢?


我使用自签名证书,因为它在测试环境中使用。这是我在搜索互联网后想出来的垃圾方案。我还是新手,对这个主题仍然感到困惑。我将研究keytool解决方案。我相信列出的步骤中没有一个签署了证书。 - vic99
请解释第二步的哪一部分负责签发证书。 - vic99
-x509 部分实现了这个功能。 - user207421
@Szobi 可能是这样,但这绝对不是我的错。这是你点的踩吗?如果是,那就很难理解了。 - user207421
当然,抱歉。事实上,并不是你的错。我downvote的原因是因为你只含糊地引用了“JDK中的JSSE参考指南”,并没有提供链接。但它实际上与我尝试使带有自签名证书和TLS的简单gRPC示例工作的挫败感有很多关系。所以再次抱歉。如果你编辑你的答案(任何方式都可以),我可以取消downvote。现在我不能这样做。感谢您在询问原因时非常友善。我欣赏你比我更高的同理心水平 :) - Sobvan
显示剩余4条评论

-1

Q1. 我想知道为什么我需要在第六步中将服务器和客户端自己的证书添加到各自的受信任存储库中。

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

Q2. 我能否缩短步骤数量以实现同样的效果?如果可以,怎样做?

A2. 可以,使用公共证书来签署您的客户端和服务器证书。

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

希望对您有所帮助。

最好的问候,Ace


Q1的答案是你不需要这样做,而这暴露了OP的基本误解,你对它的回答似乎也表现出了同样的误解。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接