【问题标题】:How to use .key and .crt file in java that generated by openssl?如何在openssl生成的java中使用.key和.crt文件?
【发布时间】:2011-09-22 20:57:56
【问题描述】:

我需要java中的非对称加密。我通过http://www.imacat.idv.tw/tech/sslcerts.html 中所说的openssl 生成带有自己密码的.key 和.crt 文件和.crt 文件。
如何使用这些 .key 和 .crt 文件提取 Java 中的公钥和私钥?

【问题讨论】:

    标签: java ssl cryptography openssl crt


    【解决方案1】:

    您的 .key 和 .crt 文件可能是 PEM 格式。要检查这一点,请使用文本编辑器打开它们并检查内容是否类似于 ------BEGIN CERTIFICATE------(或“开始 RSA 私钥”......)。这通常是 OpenSSL 使用的默认格式,除非您明确指定 DER。

    这可能不是必需的(见下文),但如果您的证书是 DER 格式(二进制格式),您可以使用以下方法将它们转换为 PEM 格式:

    openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem
    

    (如果需要,请查看openssl rsa 的帮助,以使用私钥执行类似操作。)

    然后你有两个选择:

    • 构建一个 PKCS#12 文件

      openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
      

    然后,您可以直接从 Java 中将其用作“PKCS12”类型的密钥库。除文件位置外,大多数 Java 应用程序都应允许您指定密钥库类型。对于默认系统属性,这是使用javax.net.ssl.keyStoreType 完成的(但您正在使用的应用程序可能没有使用它)。否则,如果您想显式加载它,请使用以下内容:

    KeyStore ks = KeyStore.getInstance("PKCS12");
    FileInputStream fis =
        new FileInputStream("/path/to/myhost.p12");
    ks.load(fis, "password".toCharArray()); // There are other ways to read the password.
    fis.close();
    

    (然后,您应该能够遍历KeyStore 的aliases() 并使用getCertificate(然后使用getPublicKey() 作为公钥)和getKey()。

    • 使用BouncyCastle的PEMReader。

       FileReader fr = ... // Create a FileReader for myhost.crt
       PEMReader pemReader = new PEMReader(fr);
       X509Certificate cert = (X509Certificate)pemReader.readObject();
       PublicKey pk = cert.getPublicKey();
       // Close reader...
      

    对于私钥,如果私钥受密码保护,则需要实现 PasswordFinder(请参阅 PEMReader 文档中的链接)来构造 PEMReader。 (您需要将readObject() 的结果转换为Key 或PrivateKey。)

    【讨论】:

    • 如何用 ks 获取私钥?
    • 使用getKey()。使用 PKCS#12 格式时,密钥的密码与存储本身的密码相同。
    • 非常感谢这个小例子。它帮助我理解了 pem 阅读器,阅读了我拥有的 .crt 文件,更好地理解了 DER/PEM 等等。现在从 pem 文件中取出两个密钥应该没有问题。你能不能去为 bouncycastle 写信……他们需要帮助!
    • @AndrewBacker,只记得 BouncyCastle 的 PEMReader 并不总是必要的,这取决于您必须阅读的内容。如果只是为了证书,你可以试试CertificateFactory(JSSE 的一部分)。请参阅示例 here 并注意 here(该评论可能在那里有用)。
    • 是的。我确实有 PEM 编码的文件,所以 CertificateFactory 似乎可以工作...但名称为 generateCertificate... 一年内都猜不到。
    【解决方案2】:

    这应该做你想做的事情(使用上面建议的 BouncyCastle PEMReader)——获取 PEM 编码的私钥 + 证书,并输出一个 PKCS#12 文件。对用于保护私钥的 PKCS12 使用相同的密码。

    public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
        // Get the private key
        FileReader reader = new FileReader(keyFile);
    
        PEMReader pem = new PEMReader(reader, new PasswordFinder() {
            @Override public char[] getPassword() {
                return password.toCharArray();
            }
        });
    
        PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();
    
        pem.close();
        reader.close();
    
        // Get the certificate      
        reader = new FileReader(cerFile);
        pem = new PEMReader(reader);
    
        X509Certificate cert = (X509Certificate)pem.readObject();
    
        pem.close();
        reader.close();
    
        // Put them into a PKCS12 keystore and write it to a byte[]
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(null);
        ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new java.security.cert.Certificate[]{cert});
        ks.store(bos, password.toCharArray());
        bos.close();
        return bos.toByteArray();
    }
    

    【讨论】:

      【解决方案3】:

      看看 org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator

      【讨论】:

        【解决方案4】:

        据我了解,OpenSSL 以所谓的 PEM 格式保存文件。您需要将其转换为 Java 密钥存储 (JKS) 格式,然后使用该格式(Java 原生)来提取文件。转换请使用this Google query,它给出了很好的结果。

        将 JKS 文件加载到 java.security.KeyStore 类。然后使用 getCertificate 和 getKey 方法获取所需的信息。

        【讨论】:

        • @SjB 查看这些文件 - 如果它们是带有“----- BEGIN ... -----”页眉和相应页脚的文本,而不是 PEM 格式。
        猜你喜欢
        • 2018-04-14
        • 2019-05-20
        • 2018-10-27
        • 1970-01-01
        • 2010-11-02
        • 2022-09-28
        • 2022-08-16
        • 1970-01-01
        相关资源
        最近更新 更多