18

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

4

4 回答 4

27

您的.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();

(然后,您应该能够遍历and 使用(然后aliases()是公钥)和.KeyStoregetCertificategetPublicKey()getKey()

  • 使用BouncyCastlePEMReader.

     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()转换为 aKeyPrivateKey。)

于 2011-06-26T11:37:25.743 回答
5

这应该做你想做的事情(使用上面建议的 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();
}
于 2012-03-22T20:02:25.480 回答
1

看看 org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator

于 2011-06-26T06:39:26.590 回答
1

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

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

于 2011-06-26T07:08:46.230 回答