146

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

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

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

4

15 回答 15

240

这很简单,至少使用jdk6......

bash$ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN=foo.example.com,L=墨尔本,ST=维多利亚,C=AU'
输入密钥库密码:  
重新输入新的密码:
输入密钥密码
        (如果与密钥库密码相同,则返回):  
bash$ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -text
输入密钥库密码:asdasd
证书:
    数据:
        版本:3 (0x2)
        序列号:1237334757 (0x49c03ae5)
        签名算法:dsaWithSHA1
        发行人:C=AU,ST=维多利亚,L=墨尔本,CN=foo.example.com
        有效性
            不早于:格林威治标准时间 2009 年 3 月 18 日 00:05:57
            不晚于:格林威治标准时间 2009 年 6 月 16 日 00:05:57
        主题: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=维多利亚,L=墨尔本,CN=foo.example.com
        有效性
            不早于:格林威治标准时间 2009 年 3 月 18 日 00:05:57
            不晚于:格林威治标准时间 2009 年 6 月 16 日 00:05:57
        主题: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
于 2009-03-18T00:32:33.857 回答
30

openssl使用 StoBor 的命令时,我不断收到错误消息:

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,参数的值无关紧要。

于 2012-11-17T02:46:53.457 回答
19

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

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
于 2011-05-20T19:24:46.800 回答
15

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
于 2009-03-17T05:18:15.353 回答
12

将 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>
于 2016-01-12T13:07:17.127 回答
5

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

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

解释:

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

首先将密钥库从 JKS 转储到 PKCS12

1. keytool -importkeystore -srckeystore ~/.android/debug.keystore -destkeystore middle.p12 -srcstoretype JKS -deststoretype PKCS12

将新的 pkcs12 文件转储到 pem

  1. openssl pkcs12 -in middle.p12 -nodes -out middle.rsa.pem

您应该同时拥有 pem 格式的证书和私钥。把它们分开。将“BEGIN CERTIFICATE”和“END CERTIFICATE”之间的部分放入cert.x509.pem 将“BEGIN RSA PRIVATE KEY”和“END RSA PRIVATE KEY”之间的部分放入private.rsa.pem 将私​​钥转换为pk8格式为由signapk预期

3.openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt

于 2018-06-05T10:25:12.077 回答
2

我找到了一个非常有趣的解决方案:

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

然后,我将公钥/私钥对分成两个文件 private.key publi.pem 并且它可以工作!

于 2011-10-04T12:40:21.297 回答
2

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

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

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

    使用 Portcle 从 JKS 导出 PEM 私钥

于 2016-04-27T13:41:54.777 回答
1

好吧, 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

也许有关错误/失败的更多详细信息?

于 2009-03-17T03:46:56.697 回答
1

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

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

于 2017-03-10T20:07:08.340 回答
1

首先创建密钥库文件为

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

输入密钥库密码:
重新输入新密码:
您的名字和姓氏是什么?未知: FirstName LastName
您的组织单位的名称是什么?未知: 移动开发
贵组织的名称是什么?未知: 您的公司名称
您所在城市或地区的名称是什么?您所在的州或省的名称是什么?
本机的两个字母的国家/地区代码是什么?未知:IN //按回车

现在它会要求确认

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_certificate.pem -keystore androidkey.jks
输入密钥库密码:
证书存储在文件中

于 2018-03-10T07:09:47.733 回答
0

我只留下以下两个命令来完成这项工作

# openssl pkcs12 -info -nodes -in /srv/apache-tomcat-8.5.72/conf/cert.jks -nokeys 2>&1| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > server.crt
Enter Import Password:
# openssl pkcs12 -info -nodes -in /srv/apache-tomcat-8.5.72/conf/cert.jks -nocerts 2>&1| sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > server.key
Enter Import Password:
于 2021-10-17T10:45:10.707 回答
0

打开您的终端并转到 jks 文件位置并写下这个 >>>> keytool -export -rfc -alias key0 -file android_certificate.pem -keystore androidkey.jks

于 2022-02-03T13:22:47.110 回答
-1

将 Java 密钥库转换为 PEM 格式

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

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

于 2018-08-31T09:44:22.517 回答