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

How to create keystore and truststore using self-signed certificate?

我们有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 -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是编程和开发问题的站点。 这个问题似乎是偏离主题的,因为它不是关于编程或开发的。 请参阅帮助中心内的相关主题。 也许超级用户或Unix& Linux Stack Exchange将是一个更好的问题。 另请参阅我在哪里发布有关Dev Ops的问题?
  • 另请参阅Keytool创建受信任的自签名证书。


Q1. I would like to know why I need to add server’s and client’s own certificates into their respective truststores, in step 6.

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

Q2. Can I reduce the number steps to achieve the same thing? If yes, then how?

您可以使用keytool完成整个操作。大量记录的例子。您根本不需要使用openssl

批判:

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

您可以在JDK文档的JSSE参考指南中找到正确的操作说明。每个约三个步骤。但它真正表明的是,自签名证书真的不值得他们印刷的纸张。获取CA签名证书。更多的价值和更容易部署(没有出口步骤)。

你在哪里得到这个垃圾?

  • 我使用自签名因为它在测试环境中使用。在搜索互联网后,我把这个垃圾弄得一团糟。我是新手,仍然对这个问题感到困惑。我将研究keytool解决方案。我相信没有列出的步骤签署了证书。
  • @ vic99我问你在哪里提出它,而"互联网"不是一个充分的答案。请提供适当的引用。第2步创建自签名证书。但是,后续步骤无法正确处理。
  • 请向我解释第2步的哪一部分正在处理签署证书。
  • -x509部分就是这样。
  • FWIW OP可以通过将openssl genrsa -out keyfile 2048; openssl req -new -x509 -key keyfile ...替换为执行两个部分的openssl req -new -x509 -newkey rsa:2048 -keyout keyfile -nodes ...来节省另一个步骤。此外,可能没有必要将OpenSSL的P12转换为JKS,因为至少2004年Java加密可以很好地处理P12。也就是说,我同意使用keytool,实际的CA更好。
  • 这篇文章包含了为什么安全性如此被提升的基础知识。 RSA是一个非常简单的概念。使其难以使用会对确保世界造成如此大的伤害。为什么必须成为安全专家才能为您的通信添加简单的RSA加密。
  • @Szobi可能是这样,但肯定不是我的错。这是你的downvote吗?如果是这样,很难理解。
  • 当然,抱歉。这不是你的错。 downvote没有提供链接,只是简单地引用了"JDK中的JSSE参考指南"。但它实际上与我试图获得一个简单的gRPC示例以及自签名证书和TLS工作的挫折有很大关系。再次对此感到抱歉。如果您编辑答案(以任何方式)我可以删除downvote。现在我不能。并且感谢您在询问原因时非常好。我感谢你比我的更高层次的同理心:)
  • @ da7编辑被拒绝。您完全没有证据表明这些步骤是概念验证或学习尝试。这是你的假设。不是我的。我的话明确地排除了这种可能性,假设垃圾来自外部,并询问在哪里,并且因此这是一个合理的问题,要求外部来源可以被追踪和失去信誉。
  • 我还要补充一点,letsencrypt允许您拥有免费的CA签名证书。我最近在使用它。


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

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

Q2。我可以减少数量步骤来实现同样的目标吗?如果是,那怎么样?

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

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

希望这可以帮助。

最好的,Ace

  • 第一季度的答案是你没有,而且这背叛了OP的基本误解,而你自己对它的回答似乎表现出同样的误解。