将Java密钥库转换为PEM格式
我正在尝试使用keytool和openssl应用程序从Java密钥库文件转换为PEM文件。 但我找不到转换的好方法。 有任何想法吗?
不是直接将密钥库转换成PEM,而是先尝试创build一个PKCS12文件,然后转换成相关的PEM文件和Keystore。 但是我不能使用它们build立连接。 (注意,我只需要一个PEM文件和一个Keystore文件来实现一个安全的连接,没有像从“从一个Java密钥库文件启动”这样的限制:)所以,从其他格式开始我的情况是可以接受的)
但是从jks到pem的直接转换方法是可取的。
这很简单,至less使用jdk6 …
bash $ keytool -keystore foo.jks -genkeypair -alias foo \ -dname'CN = foo.example.com,L =墨尔本,ST =维多利亚,C = AU' input密钥库密码: 重新input新的密码: input密钥 (如果与密钥库密码相同,则返回): bash $ keytool -keystore foo.jks -exportcert -alias foo | \ openssl x509 -inform der -text input密钥库密码:asdasd 证书: 数据: 版本:3(0x2) 序列号:1237334757(0x49c03ae5) 签名algorithm:dsaWithSHA1 发行人:C = AU,ST =维多利亚州,L =墨尔本,CN = foo.example.com 合法性 不是之前:3月18日00:05:57 2009 GMT 不是之后:6月16日00:05:57 2009 GMT Subject:C = AU,ST = Victoria,L = Melbourne,CN = foo.example.com 主题公钥信息: 公钥algorithm: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 input目标密钥库密码: 重新input新的密码: input源密钥库密码: 别名foo的条目已成功导入。 导入命令完成:1个条目成功导入,0个条目失败或取消 bash $ openssl pkcs12 -in foo.p12 -out foo.pem input导入密码: MACvalidationOK inputPEM密码短语: validation - inputPEM密码短语: bash $ openssl x509 -text -in foo.pem 证书: 数据: 版本:3(0x2) 序列号:1237334757(0x49c03ae5) 签名algorithm:dsaWithSHA1 发行人:C = AU,ST =维多利亚州,L =墨尔本,CN = foo.example.com 合法性 不是之前:3月18日00:05:57 2009 GMT 不是之后:6月16日00:05:57 2009 GMT Subject:C = AU,ST = Victoria,L = Melbourne,CN = foo.example.com 主题公钥信息: 公钥algorithm: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密钥 inputPEM密码短语: 私钥:(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格式的密钥库中的所有密钥和证书。
(如果你愿意的话,最后一个文件可以分解成密钥和证书。)
命令摘要 – 创buildJKS密钥库:
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的命令时,我一直从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
,参数的值并不重要。
keytool
命令将不允许您从密钥库中导出私钥。 你必须写一些Java代码来做到这一点。 打开密钥库,获取所需的密钥,并将其保存为PKCS#8格式的文件。 也保存关联的证书。
KeyStore ks = KeyStore.getInstance("jks"); /* Load the key store. */ ... char[] password = ...; /* Save the private key. */ FileOutputStream kos = new FileOutputStream("tmpkey.der"); Key pvt = ks.getKey("your_alias", password); kos.write(pvt.getEncoded()); kos.flush(); kos.close(); /* Save the certificate. */ FileOutputStream cos = new FileOutputStream("tmpcert.der"); Certificate pub = ks.getCertificate("your_alias"); cos.write(pub.getEncoded()); cos.flush(); cos.close();
使用OpenSSL实用程序将这些文件(二进制格式)转换为PEM格式。
openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem openssl x509 -inform der < tmpcert.der > tmpcert.pem
使用keytool直接从jks转换为pem文件
keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
将JKS文件转换为PEM和KEY格式(.crt和.key)的简化说明:
keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password> openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File> openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File> openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>
那么, OpenSSL应该从#12文件中手动执行 :
openssl pkcs12 -in pkcs-12-certificate-file -out pem-certificate-file openssl pkcs12 -in pkcs-12-certificate-and-key-file -out pem-certificate-and-key-file
也许更详细的错误/失败是什么?
将JKS KeyStore转换为单个PEM文件可以使用以下命令轻松完成:
keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [AZ]*-*/,/-*END [AZ]-*/!d" >> "myKeystore.pem"
说明:
-
keytool -list -rfc -keystore "myKeystore.jks"
以PEM格式列出'myKeyStore.jks'KeyStore中的所有内容。 但是,它也打印额外的信息。 -
| sed -e "/-*BEGIN [AZ]*-*/,/-*END [AZ]-*/!d"
| sed -e "/-*BEGIN [AZ]*-*/,/-*END [AZ]-*/!d"
过滤掉所有我们不需要的东西。 我们只剩下KeyStore中的所有PEM。 -
>> "myKeystore.pem"
将PEM写入文件“myKeyStore.pem”。
试试Keystore Explorer http://keystore-explorer.org/
KeyStore Explorer是Java命令行实用程序keytool和jarsigner的开源GUI替代品。 它也是openssl / pkcs12。
如果你没有安装openssl,你正在寻找一个快速的解决scheme,有一个叫做portcle的软件,它是非常有用和小的下载。
据我所知,缺点是没有命令行。 但是从GUI,导出PEM私钥是非常简单的:
- 打开你的JKS密钥存储
- 右键单击您的私钥条目并select导出
-
select私钥和证书以及PEM格式