这应该做你想做的事情(使用上面建议的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(); }
看看org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
您的 .key 和 .crt 文件可以是PEM格式。要检查这一点,请使用文本编辑器打开它们,并检查内容是否类似 ------BEGIN CERTIFICATE------ (或“开始RSA私钥”......)。这通常是OpenSSL使用的默认格式,除非您明确指定了DER。
.key
.crt
------BEGIN CERTIFICATE------
它可能不是必需的(见下文),但如果您的证书是DER格式(二进制格式),您可以使用以下方式将它们转换为PEM格式:
openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem
(查看帮助 openssl rsa 如果需要,可以使用私钥做类似的事情。)
openssl rsa
然后你有两个选择:
构建PKCS#12文件
openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
然后,您可以直接从Java中将其用作“PKCS12”类型的密钥库。除文件位置外,大多数Java应用程序都应允许您指定密钥库类型。对于默认系统属性,可以使用 javax.net.ssl.keyStoreType (但您正在使用的应用程序可能没有使用此功能)。否则,如果要显式加载它,请使用以下内容:
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();
(然后,你应该能够遍历 aliases() 的 KeyStore 并使用 getCertificate (然后 getPublicKey() 对于公钥)和 getKey() 。
aliases()
KeyStore
getCertificate
getPublicKey()
getKey()
使用 充气城堡 的 PEMReader 。
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 。)
PasswordFinder
readObject()
Key
PrivateKey
据我了解,OpenSSL已经以所谓的PEM格式保存了文件。您需要将其转换为Java密钥存储(JKS)格式,然后使用该格式(Java本机)来提取文件。如需转换,请使用 这个Google查询 ,它给出了相当不错的结果。
将JKS文件加载到java.security.KeyStore类。然后使用getCertificate和getKey方法获取所需的信息。