首页 文章

将Java密钥库转换为PEM格式

提问于
浏览
115

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

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

但是从jks到pem的直接转换方法是优选的 .

13 回答

  • 0

    这很简单,至少使用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:
    

    你最终得到:

    • 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
    
  • 27

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

  • 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
    
  • 1

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

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

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

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

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

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

  • 6

    好吧,来自#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
    

    可能有关错误/失败的详细信息?

  • 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" 以PEM格式列出'myKeyStore.jks' KeyStore中的所有内容 . 但是,它还会打印额外的信息 .

    • | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" 过滤掉了我们不需要的一切 . 我们只剩下KeyStore中所有内容的PEM .

    • >> "myKeystore.pem" 将PEM写入文件'myKeyStore.pem' .

  • 0

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

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

    • 打开JKS密钥库

    • 右键单击您的私钥条目,然后选择导出

    • 选择私钥和证书以及PEM格式

    Export PEM private key from JKS with Portcle

  • 11

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

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

  • 0

    首先创建密钥库文件

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

    输入密钥库密码:
    重新输入新的密码:
    你的名字和姓氏是什么?未知: FirstName LastName
    您的组织单位的名称是什么?未知: Mobile Development
    您的组织名称是什么?未知: your company name
    您所在城市或地区的名称是什么?您所在州或省的名称是什么?
    这个单位的双字母国家代码是什么?未知:IN //按Enter键

    现在它会要求确认

    是CN = FirstName LastName,OU =移动开发,O =您的公司名称,L = CityName,ST = StateName,C = IN是否正确? [不]: yes

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

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

    C:\ Program Files \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
    输入密钥库密码:
    证书存储在文件中

  • 0

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

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

    将新的pkcs12文件转储到pem中

    • openssl pkcs12 -in intermediate.p12 -nodes -out intermediate.rsa.pem

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

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

    将Java密钥库转换为PEM格式

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

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

相关问题