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

时间:2017-02-22 17:26:27

标签: java ssl openssl keystore keytool

我们有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

2 个答案:

答案 0 :(得分:4)

  

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

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

  

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

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

批判:

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

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

你从哪里得到这种垃圾?

答案 1 :(得分:-1)

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

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

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

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

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

希望这有帮助。

最好,王牌