将 Java 密钥库转换为 PEM 格式

新手上路,请多包涵

我正在尝试使用 keytool 和 openssl 应用程序将 Java 密钥库文件转换为 PEM 文件。但是我找不到进行转换的好方法。有任何想法吗?

我没有将密钥库直接转换为 PEM,而是尝试先创建一个 PKCS12 文件,然后再转换为相关的 PEM 文件和密钥库。但是我无法使用它们建立连接。 (请注意,我只需要一个 PEM 文件和一个密钥库文件来实现安全连接。没有像“从 Java 密钥库文件开始”这样的限制。:) 所以从其他格式开始对我来说是可以接受的)

但是从 jks 到 pem 的直接转换方法更可取。

原文由 Chathuranga Chandrasekara 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

这很简单,至少使用 jdk6 …

bash$ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN=foo.example.com,L=墨尔本,ST=维多利亚,C=AU'
输入密钥库密码:
重新输入新的密码:
输入密钥密码
        (如果与密钥库密码相同则返回):
bash$ keytool -keystore foo.jks -exportcert -别名 foo | \
       openssl x509 -inform der -text
输入密钥库密码:asdasd
证书:
    数据:
        版本:3 (0x2)
        序列号:1237334757 (0x49c03ae5)
        签名算法:dsaWithSHA1
        发行人:C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
        有效性
            不早于:格林威治标准时间 2009 年 3 月 18 日 00:05:57
            不晚于:2009 年 6 月 16 日 00:05:57 GMT
        主题:C=AU,ST=维多利亚,L=墨尔本,CN=foo.example.com
        主题公钥信息:
            公钥算法:dsaEncryption
            DSA 公钥:
                酒吧:
                    00:e2:66:5c:e0:2e:da:e0:6b:a6:aa:97:64:59:14:
                    7e:a6:2e:5a:45:f9:2f:b5:2d:f4:34:27:e6:53:c7:


bash$ keytool -importkeystore -srckeystore foo.jks \
       -destkeystore foo.p12 \
       -srcstoretype jks \
       -deststoretype pkcs12
输入目标密钥库密码:
重新输入新的密码:
输入源密钥库密码:
别名 foo 的条目已成功导入。
导入命令完成:1 个条目成功导入,0 个条目失败或取消

bash$ openssl pkcs12 -in foo.p12 -out foo.pem
输入导入密码:
MAC验证正常
输入 PEM 密码短语:
验证 - 输入 PEM 密码短语:

bash$ openssl x509 -text -in foo.pem
证书:
    数据:
        版本:3 (0x2)
        序列号:1237334757 (0x49c03ae5)
        签名算法:dsaWithSHA1
        发行人:C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
        有效性
            不早于:格林威治标准时间 2009 年 3 月 18 日 00:05:57
            不晚于:2009 年 6 月 16 日 00:05:57 GMT
        主题:C=AU,ST=维多利亚,L=墨尔本,CN=foo.example.com
        主题公钥信息:
            公钥算法:dsaEncryption
            DSA 公钥:
                酒吧:
                    00:e2:66:5c:e0:2e:da:e0:6b:a6:aa:97:64:59:14:
                    7e:a6:2e:5a:45:f9:2f:b5:2d:f4:34:27:e6:53:c7:


bash$ openssl dsa -text -in foo.pem
读取 DSA 密钥
输入 PEM 密码短语:
私钥:(1024 位)
私人:
    00:8f:b1:af:55:63:92:7c:d2:0f:e6:f3:a2:f5:ff:
    1a:7a:fe:8c:39:dd
酒吧:
    00:e2:66:5c:e0:2e:da:e0:6b:a6:aa:97:64:59:14:
    7e:a6:2e:5a:45:f9:2f:b5:2d:f4:34:27:e6:53:c7:

你最终得到:

  • foo.jks - java 格式的密钥库。
  • foo.p12 - PKCS#12 格式的密钥库。
  • foo.pem - 来自密钥库的所有密钥和证书,采用 PEM 格式。

(如果您愿意,可以将最后一个文件拆分为密钥和证书。)


命令摘要 - 创建 JKS 密钥库:

 keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

命令摘要 - 将 JKS 密钥库转换为 PKCS#12 密钥库,然后转换为 PEM 文件:

 keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

如果您的 JKS 密钥库中有多个证书,并且您只想导出与其中一个别名关联的证书和密钥,则可以使用以下变体:

 keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

命令摘要 - 将 JKS 密钥库与 PEM 文件进行比较:

 keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem

原文由 Stobor 发布,翻译遵循 CC BY-SA 2.5 许可协议

在使用 StoBor 的命令时,我一直收到来自 openssl 的错误:

 MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

出于某种原因,只有这种命令风格适用于我的 JKS 文件

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

关键是设置 destkeypass ,参数的值无关紧要。

原文由 cmcginty 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题