如何在java中使用由openssl生成的.key和.crt文件?
我需要Java中的非对称加密。我生成.key和.crt文件,使用自己的密码和.crt文件,由opensl http://www.imacat.idv.tw/tech/sslcerts.html 说。
如何使用这些.key和.crt文件来提取Java中的公钥和私钥?
我需要Java中的非对称加密。我生成.key和.crt文件,使用自己的密码和.crt文件,由opensl http://www.imacat.idv.tw/tech/sslcerts.html 说。
如何使用这些.key和.crt文件来提取Java中的公钥和私钥?
您的 和 文件可能采用 PEM 格式。要检查这一点,请使用文本编辑器打开它们,并检查内容是否看起来像(或“开始RSA私钥”...)。这通常是 OpenSSL 使用的默认格式,除非您显式指定了 DER。.key
.crt
------BEGIN CERTIFICATE------
这可能不是必需的(见下文),但如果您的证书是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()
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 文档中的链接)来构造私钥是否受密码保护。(您需要将 的结果转换为 or 。)PasswordFinder
PEMReader
readObject()
Key
PrivateKey
这应该做你想做的事情(按照上面的建议使用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();
}