将 JavaKeystore 转换为 PEM 格式

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

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

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

320667 次浏览

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

也许可以更详细地说明错误/失败是什么?

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

很简单,至少使用 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-java 格式的 keystore。
  • P12-PKCS # 12格式的密钥存储库。
  • PEM-keystore 中的所有密钥和证书,采用 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

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

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

我找到了一个非常有趣的解决办法:

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

然后,我将这对公钥/私钥分成两个文件 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 和 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>

可以使用以下命令轻松地将 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’。

如果你没有安装 openssl,你正在寻找一个快速的解决方案,有一个软件称为 吊车,这是非常有用的和小的下载。

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

  1. 给你开 JKS 钥匙店
  2. 右键单击您的私钥条目并选择 export
  3. 选择 Private Key 和证书以及 PEM 格式

    Export PEM private key from JKS with Portcle

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

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

首先创建密钥存储库文件

C: Program Files Android Studio jre bin > Keytool-keystore androidkey.jks-genkeydouble-alias androidkey

输入密钥存储密码:
重新输入新密码:
你的姓和名是什么? 未知: < b > FirstName LastName
你的组织单位叫什么名字? 未知: < b > 手机开发
你的组织叫什么名字? 未知: < b > 你的公司名称
你所在的城市或地区的名称是什么? 你所在的州或省的名称是什么?
这个单元的两个字母的国家代码是什么? 未知: IN//按回车 < br >

现在它将要求确认

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

输入密钥密码 (如果返回与密钥存储库密码相同) : 按回车如果你想要相同的密码

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

C: Program Files Android Studio jre bin > Keytool-export-rfc-alias androidkey-file android _ certificate. pem-keystore androidkey.jks
输入密钥存储密码:
存储在文件中的证书

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

1. Keytool-import keystore-srckeystore ~/. android/debug. keystore-destkeystore mediate.p12-srcstoretype JKS-deststoretype PKCS12

将新的 pkcs12文件转储到 pem 中

  1. Openssl pkcs12-in mediate.p12-node-out mediate.rsa.pem

您应该同时拥有 cert 和 pem 格式的私钥。 将“ BEGIN 证书”和“ END 证书”之间的部分放入 cert.x509.pem 将“ BEGIN RSA PRIVATE KEY”和“ END RSA PRIVATE KEY”之间的部分放入 PRIVATE. RSA.pem 如 signapk 所期望的那样,将私钥转换为 pk8格式

3. Openssl pkcs8-topk8-outform DER-in private ate.rsa.PEM-information PEM-out private ate.pk8-nocrypt

将 JavaKeystore 转换为 PEM 格式

所有问题中最精确的答案一定是这是不可能的。

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

我只需要在这里执行两个命令就可以了

# 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:

打开你的终端,进入 jks 文件位置 然后写下这个 Keytool-export-rfc-alias key0-file android _ certificate. pem-keystore androidkey.jks

假设您的密钥存储库文件是 abcd.jks,并且它存在于 C: Data,

在 cmd 窗口中,在文件所在的位置尝试:

keytool -export -rfc -keystore C:\Data\abcd.jks -alias abcd -file C:\Data\abcd.pem

接下来,在提示时输入密码,您将在指定的位置获得转换后的格式

Keytool-exportcert-alias self-sign-keypass 密码-keystore 钥匙店 Jks-rfc-file test-user. pem

命令将提示输入 keyStore password-Enter The keyStore password

密钥密码。 Keystore 文件(jks 或 keystore)

当你有相同的 钥匙钥匙店密码时,这将是很容易的。