将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> 

我发现一个非常有趣的解决scheme

http://www.swview.org/node/191

然后,我把公钥/私钥分成两个文件private.key publi.pem,它的工作原理!

那么, 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" 

说明:

  1. keytool -list -rfc -keystore "myKeystore.jks"以PEM格式列出'myKeyStore.jks'KeyStore中的所有内容。 但是,它也打印额外的信息。
  2. | sed -e "/-*BEGIN [AZ]*-*/,/-*END [AZ]-*/!d" | sed -e "/-*BEGIN [AZ]*-*/,/-*END [AZ]-*/!d"过滤掉所有我们不需要的东西。 我们只剩下KeyStore中的所有PEM。
  3. >> "myKeystore.pem"将PEM写入文件“myKeyStore.pem”。

试试Keystore Explorer http://keystore-explorer.org/

KeyStore Explorer是Java命令行实用程序keytool和jarsigner的开源GUI替代品。 它也是openssl / pkcs12。

如果你没有安装openssl,你正在寻找一个快速的解决scheme,有一个叫做portcle的软件,它是非常有用和小的下载。

据我所知,缺点是没有命令行。 但是从GUI,导出PEM私钥是非常简单的:

  1. 打开你的JKS密钥存储
  2. 右键单击您的私钥条目并select导出
  3. select私钥和证书以及PEM格式

    使用Portcle从JKS导出PEM私钥