如何在openssl生成的java中使用.key和.crt文件?

时间:2011-06-26 06:20:57

标签: java ssl cryptography openssl crt

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

4 个答案:

答案 0 :(得分:20)

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

(然后,您应该能够遍历KeyStorealiases()并使用getCertificate(然后使用getPublicKey()作为公钥)和{{1 }}

对于私钥,如果私钥受密码保护,您需要实现 FileReader fr = ... // Create a FileReader for myhost.crt PEMReader pemReader = new PEMReader(fr); X509Certificate cert = (X509Certificate)pemReader.readObject(); PublicKey pk = cert.getPublicKey(); // Close reader... (请参阅PEMReader文档中的链接)以构建PasswordFinder。 (您需要将PEMReader的结果投射到readObject()Key

答案 1 :(得分:3)

这应该做你想做的事情(使用上面建议的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();
}

答案 2 :(得分:1)

看看org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator

答案 3 :(得分:1)

据我了解,OpenSSL已经以所谓的PEM格式保存了文件。您需要将其转换为Java密钥存储(JKS)格式,然后使用该格式(Java本机)来提取文件。如需转换,请使用this Google query,结果非常好。

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