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

Saj*_*ani 14 java ssl openssl cryptography crt

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

Bru*_*uno 21

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

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

openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem
Run Code Online (Sandbox Code Playgroud)

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

然后你有两个选择:

然后,您可以直接从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();
Run Code Online (Sandbox Code Playgroud)

(然后,你应该能够通过迭代aliases()KeyStore,并使用getCertificate(再getPublicKey()为公钥)和getKey().

对于私钥,您需要实现一个PasswordFinder(参见PEMReader doc链接)来构造PEMReader私钥是否受密码保护.(您需要将结果readObject()转换为KeyPrivateKey.)

  • @AndrewBacker,记得BouncyCastle的'PEMReader`并不总是必要的,这取决于你必须阅读的内容.如果它仅用于证书,您可以尝试`CertificateFactory`(JSSE的一部分).请参阅示例[此处](http://stackoverflow.com/a/18514628/372643)并注意[此处](http://stackoverflow.com/a/14561932/372643)(注释可能在此处有用). (2认同)

小智 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();
}
Run Code Online (Sandbox Code Playgroud)