我正在尝试使用keytool和openssl应用程序将Java密钥库文件转换为PEM文件。但我找不到转换的好方法。有任何想法吗?
我没有将密钥库直接转换为PEM,而是先尝试创建PKCS12文件,然后转换为相关的PEM文件和密钥库。但我无法使用它们建立连接。 (请注意,我只需要一个PEM文件和一个密钥库文件来实现安全连接。没有像“从一个java密钥库文件开始”这样的限制。:)所以从我的情况开始可以从其他格式开始)
但是从jks到pem的直接转换方法更可取。
答案 0 :(得分:200)
这非常简单,至少使用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密钥库:
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
答案 1 :(得分:29)
使用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
,参数的值无关紧要。
答案 2 :(得分:13)
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
答案 3 :(得分:12)
使用keytool
从jks直接转换为pem文件keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
答案 4 :(得分:7)
将JKS文件转换为PEM和KEY格式(.crt&amp; .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>
答案 5 :(得分:2)
答案 6 :(得分:1)
好吧,来自#12档案的OpenSSL should do it handily:
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
可能有关错误/失败的详细信息?
答案 7 :(得分:1)
使用以下命令可以轻松地将JKS KeyStore转换为单个PEM文件:
keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"
说明:
keytool -list -rfc -keystore "myKeystore.jks"
列出了myKeyStore.jks&#39;中的所有内容。 PEM格式的KeyStore。但是,它还会打印额外的信息。| sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"
过滤掉了我们不需要的所有内容。我们只剩下KeyStore中所有内容的PEM。>> "myKeystore.pem"
将PEM写入文件&#39; myKeyStore.pem&#39;。答案 8 :(得分:1)
如果您没有安装openssl并且您正在寻找快速解决方案,那么有一个名为portcle的软件非常有用且下载量很小。
缺点是据我所知,没有命令行。 但是从GUI中导出PEM私钥非常简单:
答案 9 :(得分:0)
尝试使用Keystore Explorer http://keystore-explorer.org/
KeyStore Explorer是Java命令行实用程序keytool和jarsigner的开源GUI替代品。它也有openssl / pkcs12。
答案 10 :(得分:0)
首先创建密钥库文件
C:\ Program Files \ Android \ Android Studio \ jre \ bin&gt; keytool -keystore androidkey.jks -genkeypair -alias androidkey
输入密钥库密码:
重新输入新密码:
你的名字和姓氏是什么?
未知: FirstName LastName
您的组织单位的名称是什么?
未知:移动开发
您的组织名称是什么?
未知:您的公司名称
您所在城市或地区的名称是什么?
您所在州或省的名称是什么?
这个单位的双字母国家代码是什么?
未知:IN //按enter
现在它会要求确认
CN = FirstName LastName,OU =移动开发,O =您的公司名称,L = CityName,ST = StateName,C = IN是否正确? [否]:是
输入密码 (如果与密钥库密码相同则返回):如果您需要相同的密码,请按Enter键
键已生成,现在您可以使用以下命令
简单地获取pem文件
C:\ Program Files \ Android \ Android Studio \ jre \ bin&gt; keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
输入密钥库密码:
证书存储在文件
答案 11 :(得分:0)
首先将密钥库从JKS转储到PKCS12
1。 keytool -importkeystore -srckeystore~ / .android / debug.keystore -destkeystore intermediate.p12 -srcstoretype JKS -deststoretype PKCS12
将新的pkcs12文件转储到pem
您应该拥有pem格式的证书和私钥。将它们分开。 将“BEGIN CERTIFICATE”和“END CERTIFICATE”之间的部分放入cert.x509.pem 将“BEGIN RSA PRIVATE KEY”和“END RSA PRIVATE KEY”之间的部分放入private.rsa.pem 按照signapk的预期将私钥转换为pk8格式
3。 openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt
答案 12 :(得分:0)
将Java密钥库转换为PEM格式
最准确的答案必须是这是不可能的。
Java密钥库只是用于存储密钥和证书的存储设施,而PEM仅是X.509证书的文件格式。