将Java密钥库转换为PEM格式

将Java密钥库转换为PEM格式,java,encryption,https,openssl,ssl-certificate,Java,Encryption,Https,Openssl,Ssl Certificate,我正在尝试使用keytool和openssl应用程序将Java密钥库文件转换为PEM文件。但是我找不到一个好的方法来进行转换。有什么想法吗 我没有将密钥库直接转换为PEM,而是尝试先创建一个PKCS12文件,然后转换为相关的PEM文件和密钥库。但我无法使用它们建立连接。(注意,我只需要一个PEM文件和一个密钥库文件来实现安全连接。没有像“从java密钥库文件开始”这样的限制:),所以我的案例可以接受从其他格式开始) 但最好采用从jks到pem的直接转换方法。好吧,从#12文件: 关于错误/失败的

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

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

但最好采用从jks到pem的直接转换方法。

好吧,从#12文件:


关于错误/失败的更多细节

使用
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
opensslpkcs8-inform der-nocrypttmpkey.pem
openssl x509-通知dertmpcert.pem

非常简单,至少使用jdk6

bash$ keytool -keystore foo.jks -genkeypair -alias foo \ -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU' Enter keystore password: Re-enter new password: Enter key password for (RETURN if same as keystore password): bash$ keytool -keystore foo.jks -exportcert -alias foo | \ openssl x509 -inform der -text Enter keystore password: asdasd Certificate: Data: Version: 3 (0x2) Serial Number: 1237334757 (0x49c03ae5) Signature Algorithm: dsaWithSHA1 Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Validity Not Before: Mar 18 00:05:57 2009 GMT Not After : Jun 16 00:05:57 2009 GMT Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Subject Public Key Info: Public Key Algorithm: dsaEncryption DSA Public Key: pub: 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 Enter destination keystore password: Re-enter new password: Enter source keystore password: Entry for alias foo successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled bash$ openssl pkcs12 -in foo.p12 -out foo.pem Enter Import Password: MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase: bash$ openssl x509 -text -in foo.pem Certificate: Data: Version: 3 (0x2) Serial Number: 1237334757 (0x49c03ae5) Signature Algorithm: dsaWithSHA1 Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Validity Not Before: Mar 18 00:05:57 2009 GMT Not After : Jun 16 00:05:57 2009 GMT Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com Subject Public Key Info: Public Key Algorithm: dsaEncryption DSA Public Key: pub: 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 read DSA key Enter PEM pass phrase: Private-Key: (1024 bit) priv: 00:8f:b1:af:55:63:92:7c:d2:0f:e6:f3:a2:f5:ff: 1a:7a:fe:8c:39:dd pub: 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: 命令摘要-要将JKS密钥库转换为PKCS#12密钥库,然后转换为PEM文件:

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

openssl pkcs12 -in foo.p12 -out foo.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
如果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 -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.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

使用keytool从jks直接转换为pem文件

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem

我发现了一个非常有趣的解决方案:


然后,我将这对公钥/私钥分为两个文件private.key publi.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
,参数的值无关紧要。

将JKS文件转换为PEM和密钥格式(.crt&.key)的简化指令:

keytool-importkeystore-srckeystore-destkeystore-srcstoretype jks-deststoretype pkcs12-destkeypass
openssl pkcs12-in-out
openssl x509-输出端-输入端-输出端
openssl rsa-in-out

使用以下命令可以轻松地将JKS密钥库转换为单个PEM文件:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"
说明:

  • keytool-list-rfc-keystore“myKeystore.jks”
    以PEM格式列出“myKeystore.jks”密钥库中的所有内容。但是,它也会打印额外的信息
  • |sed-e/-*开始[A-Z]*-*/,/-*结束[A-Z]-*/!d”
    过滤掉我们不需要的一切。我们只剩下密钥库中所有内容的PEM
  • >“myKeystore.pem”
    将pem写入文件“myKeystore.pem”

  • 如果您没有安装openssl,并且正在寻找一个快速的解决方案,那么有一个名为的软件,它非常有用,而且下载量很小

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

  • 打开你的JKS钥匙店
  • 在私钥条目上单击鼠标右键,然后选择“导出”
  • 选择私钥和证书以及PEM格式

  • 尝试密钥库资源管理器


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

    首先创建密钥库文件,如下所示:

    C:\Program Files\Android\Android Studio\jre\bin>keytool-keystore androidkey.jks-genkeypair-alias androidkey

    输入密钥库密码:
    重新输入新密码:
    你的名字和姓氏是什么? 未知:名字LastName
    您的组织单位名称是什么? 未知:移动开发
    你的组织名称是什么? 未知:您的公司名称
    你所在的城市或地区叫什么名字? 你所在的州或省叫什么名字?
    这个单位的两个字母的国家代码是什么? 未知:在//中按enter键

    现在它将要求确认

    CN=FirstName LastName,OU=Mobile Development,O=your company name,L=CityName,ST=StateName,C=IN是否正确? [否]:是的

    输入的密钥密码 (如果与密钥库密码相同,则返回):如果需要相同的密码,请按enter键

    密钥已经生成,现在您可以使用以下命令简单地获取pem文件

    C:\Program Files\Android\Android Studio\jre\bin>keytool-export-rfc-alias androidkey-file Android\u certificate.pem-keystore androidkey.jks
    输入密钥库密码:

    存储在文件中的证书首先将密钥库从JKS转储到PKCS12

    一,。 keytool-importkeystore-srckeystore~/.android/debug.keystore-destkeystoreintermediate.p12-srcstoretype JKS-deststoretype PKCS12

    将新的pkcs12文件转储到pem中

  • openssl pkcs12-in intermediate.p12-nodes-out intermediate.rsa.pem
  • 您应该拥有pem格式的证书和私钥。把他们分开。 将“开始证书”和“结束证书”之间的部分放入cert.x509.pem 将“开始RSA私钥”和“结束RSA私钥”之间的部分放入PRIVATE.RSA.pem 按照signapk的预期将私钥转换为pk8格式

    三,。 openssl pkcs8-topk8-outform DER-in private.rsa.pem-通知pem-out private.pk8-nocrypt

    将Java密钥库转换为PEM格式

    最准确的答案必须是这是不可能的

    Java密钥库只是加密密钥和证书的存储工具,而PEM是仅用于X.509证书的文件格式。

    谢谢erick
    keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"