如何将信任证书从 .jks 转换为 .pem?

2022-09-02 20:47:19

我有一个 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

但正如你所看到的,我无法走那么远。

我真的非常感谢一些帮助,了解如何正确地做到这一点。

谢谢


答案 1

不幸的是,keytool明确不会让您从信任存储中导出,因为他们认为PEM文件不支持可信证书的概念。所以我会改用 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

答案 2

以下简单的单行命令会将证书导出为 PEM 格式。是的,你需要openssl,keytool本身不能做到这一点。

keytool -exportcert -alias <CERT-ALIAS> -keystore <KEYSTORE-FILE> | openssl x509 -inform DER >cert.pem

推荐