如何将信任证书从 .jks 转换为 .pem?
Posted
技术标签:
【中文标题】如何将信任证书从 .jks 转换为 .pem?【英文标题】:How to convert trust certificate from .jks to .pem? 【发布时间】: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 文件。然后客户端还需要信任服务器的公钥,因此需要在客户端的信任库中。服务器需要信任客户端的公钥,因此需要在服务器的信任库中。
【参考方案1】:
不幸的是,keytool 明确不允许您从信任存储中导出,因为他们认为 PEM 文件不支持受信任证书的概念。所以我会改用 cer 文件的密钥库。
来自 cer:
openssl x509 -inform der -in serverpub.cer -out serverpub.pem
来自密钥库:
keytool -importkeystore -srckeystore server.jks -destkeystore server.p12 -deststoretype PKCS12
openssl pkcs12 -in server.p12 -nokeys -out server.cer.pem
openssl pkcs12 -in server.p12 -nodes -nocerts -out server.key.pem
或者只是尝试
keytool -exportcert -alias myserverkeys -keystore serverpub.jks -rfc -file serverpub.pem
【讨论】:
这是从哪里来的“PEM 文件不支持可信证书的概念”?我是“-1”,直到这个短语被解释或删除。 keytool -exportcert 非常适合我。您的解决方案挽救了我的一天。谢谢。【参考方案2】:以下简单的单行命令会将证书导出为 PEM 格式。是的,您需要openssl,仅keytool 无法做到这一点。
keytool -exportcert -alias <CERT-ALIAS> -keystore <KEYSTORE-FILE> | openssl x509 -inform DER >cert.pem
【讨论】:
请解释-1。它不起作用吗?在 Linux 和 Mac 上工作正常。没有在 Windows 上尝试过,但应该是一样的。 在 Windows 10 上工作正常。如果您使用-rfc
选项到 keytool -exportcert
,Openssl 不是严格要求的,它使用 PEM 格式导出。以上是关于如何将信任证书从 .jks 转换为 .pem?的主要内容,如果未能解决你的问题,请参考以下文章