【发布时间】:2014-08-12 04:19:41
【问题描述】:
我有一个 Java SSL 服务器,我希望我的 Java SSL 客户端和 C++ SSL 客户端能够连接到该服务器。 Java 客户端连接没有问题。现在我想让我的 C++ SSL 客户端能够连接。因此,为了这个目的,我想,我想将 serverpub.jks 导出到一个 .pem 文件,以便我的 C++ 客户端可以将它加载到它的 ssl 上下文中。但这不起作用。
以下描述了我如何为 Java 客户端和服务器创建 jks 密钥库,以及我如何尝试将 serverpub.jks 导出到 .pem 文件。
第 1 步:生成客户端和服务器密钥库
c:\keytool -genkeypair -alias myserverkeys -keyalg RSA -dname "CN=my Server,OU=kl2217,O=kl2217org,L=NYC,ST=NY,C=US" -keypass password -keystore server.jks -storepass password
c:\keytool -genkeypair -alias myclientkeys -keyalg RSA -dname "CN=my Client,OU=kl2217,O=kl2217org,L=NYC,ST=NY,C=US" -keypass password -keystore myclient.jks -storepass password
第 2 步:导出服务器公共证书并创建单独的密钥库
c:\keytool -exportcert -alias myserverkeys -file serverpub.cer -keystore myserver.jks -storepass spacex
c:\keytool -importcert -keystore serverpub.jks -alias serverpub -file serverpub.cer -storepass password
第 3 步:导出客户端公共证书并创建单独的密钥库
c:\keytool -exportcert -alias myclientkeys -file clientpub.cer -keystore myclient.jks -storepass spacey
c:\keytool -importcert -keystore clientpub.jks -alias clientpub -file clientpub.cer -storepass password
到目前为止一切顺利。
现在我遇到了问题。
第 4 步:将 serverpub.jks 转换为 .pem 格式
c:\keytool -importkeystore -srckeystore serverpub.jks -destkeystore serverpub.p12 -srcstoretype jks -deststoretype pkcs12
还有回复
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Problem importing entry for alias serverpub: java.security.KeyStoreException: TrustedCertEntry not supported.
Entry for alias serverpub not imported.
Do you want to quit the import process? [no]:
这是什么意思?我做错了什么?
第 5 步:本来可以
c:\openssl pkcs12 -in serverpub.p12 -out serverpub.pem
但正如你所见,我无法做到这一点。
如果能帮助我了解如何正确执行此操作,我将不胜感激。
谢谢
【问题讨论】:
-
我认为您需要先弄清楚这些概念。
serverpub.jks只包含一个证书;它里面没有私钥。您尝试将其导出到的 PKCS12 格式需要一个密钥对,即私钥和公钥。 -
啊,我明白了。那么有没有办法将证书导出到.pem?据我了解,这就是我需要加载到 C++ 客户端信任库中的全部内容,不是吗?
-
我不确定您要做什么。您是否正在尝试进行客户端身份验证?如果是这样,那么客户端需要自己的私钥。
-
所以就像Java客户端和服务器相互认证一样,我希望C++客户端和Java服务器之间也一样。
-
so
-genkeypair客户端密钥在其自己的密钥库中,并将此密钥库导出到 PKCS12 文件。然后客户端还需要信任服务器的公钥,因此需要在客户端的信任库中。服务器需要信任客户端的公钥,因此需要在服务器的信任库中。