我们有JAVA服务器和客户端使用SSL通过网络进行通信 . 服务器和客户端使用证书相互进行身份验证 . 服务器和客户端使用的密钥库类型是JKS . 服务器和客户端的密钥库和信任库文件名是:server.keystore,server.truststore,client.keystore和client.truststore .
我使用自签名证书进行测试 .
Questions:
Q1 . 我想知道为什么我需要在步骤6中将服务器和客户端自己的证书添加到各自的信任库中 .
Q2 . 我可以减少数量步骤来实现同样的目标吗?如果是,那怎么样?
为服务器创建RSA密钥,自签名证书,密钥库和信任库的步骤
1. Generate a private RSA key
openssl genrsa -out diagserverCA.key 2048
2. Create a x509 certificate
openssl req -x509 -new -nodes -key diagserverCA.key -sha256 -days 1024 -out diagserverCA.pem
3. Create a PKCS12 keystore from private key and public certificate.
openssl pkcs12 -export -name server-cert -in diagserverCA.pem -inkey diagserverCA.key -out serverkeystore.p12
4. Convert PKCS12 keystore into a JKS keystore
keytool -importkeystore -destkeystore server.keystore -srckeystore serverkeystore.p12 -srcstoretype pkcs12 -alias server-cert
5. Import a client's certificate to the server's trust store.
keytool -import -alias client-cert -file diagclientCA.pem -keystore server.truststore
6. Import a server's certificate to the server's trust store.
keytool -import -alias server-cert -file diagserverCA.pem -keystore server.truststore
为客户端创建RSA私钥,自签名证书,密钥库和信任库的步骤
1. Generate a private key
openssl genrsa -out diagclientCA.key 2048
2. Create a x509 certificate
openssl req -x509 -new -nodes -key diagclientCA.key -sha256 -days 1024 -out diagclientCA.pem
3. Create PKCS12 keystore from private key and public certificate.
openssl pkcs12 -export -name client-cert -in diagclientCA.pem -inkey diagclientCA.key -out clientkeystore.p12
4. Convert a PKCS12 keystore into a JKS keystore
keytool -importkeystore -destkeystore client.keystore -srckeystore clientkeystore.p12 -srcstoretype pkcs12 -alias client-cert
5. Import a server's certificate to the client's trust store.
keytool -import -alias server-cert -file diagserverCA.pem -keystore client.truststore
6. Import a client's certificate to the client's trust store.
keytool -import -alias client-cert -file diagclientCA.pem -keystore client.truststore
2 回答
你没有 . 您将服务器和客户端证书添加到彼此的信任库中 . 服务器和客户端不需要信任他们自己的证书,但他们确实需要相互信任 .
你可以用
keytool
完成整个事情 . 大量记录的例子 . 您根本不需要使用openssl
.批判:
在第一部分中,步骤5和6都是错误的 . 应该有一个步骤:导出服务器's certificate to the client' s truststore .
同样,在第二部分中,步骤5和6再次出错,并且应该只有步骤:导出客户端's certificate to the server'的密钥库 .
换句话说,两个步骤5s应该互换,并且两个步骤6s被删除 .
您将在JDK文档中的JSSE Reference Guide中找到正确的操作说明 . 每个约三个步骤 . 但真正显示的是,自签名证书确实没有打印出来 . 获取CA签名证书 . 更多的 Value 和更容易部署(没有出口步骤) .
你在哪里得到这个垃圾?
Q1 . 我想知道为什么我需要在步骤6中将服务器和客户端自己的证书添加到各自的信任库中 .
A1 . 如果您没有使用通用证书颁发机构来签署您的客户端和服务器证书......将每个证书添加到信任存储区是唯一的方法 . 但是......即使在测试环境中,您也可以创建自己的证书颁发机构,并使用它来签署您创建的客户端和服务器证书 . 然后,您的信任存储区只需要包含证书颁发机构的公钥 .
Q2 . 我可以减少数量步骤来实现同样的目标吗?如果是,那怎么样?
A2 . 是的,使用通用证书签署您的客户端和服务器证书 .
查看this post中的脚本,了解如何创建自己的CA并使用它来签署服务器和客户端证书 . 它还创建了您的信任存储......
希望这可以帮助 .
最好的,Ace