如何在java中使用openssl生成的.key和.crt文件?
我需要java中的非对称加密。我使用自己的密码生成 .key 和 .crt 文件,并通过 openssl 生成 .crt 文件,如 http 中所述://www.imacat.idv.tw/tech/sslcerts.html .
如何使用这些.key和.crt文件在Java中提取公钥和私钥?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您的
.key
和.crt
文件可能采用 PEM 格式。要检查这一点,请使用文本编辑器打开它们,并检查内容是否类似于-----BEGIN CERTIFICATE------
(或“开始 RSA 私钥”...)。这通常是 OpenSSL 使用的默认格式,除非您明确指定了 DER。它可能不是必需的(见下文),但如果您的证书是 DER 格式(二进制格式),您可以使用以下方法将它们转换为 PEM 格式:(
查看
openssl rsa
的帮助以执行类似的操作如果需要,请使用私钥。)然后您将获得两个选项:
构建 PKCS#12 文件
然后您可以直接从 Java 将其用作“PKCS12”类型的密钥库。大多数 Java 应用程序应该允许您指定除文件位置之外的密钥库类型。对于默认系统属性,这是通过 javax.net.ssl.keyStoreType 完成的(但您正在使用的应用程序可能不使用此属性)。否则,如果您想显式加载它,请使用类似以下内容:(
然后,您应该能够迭代 aliases() .com/javase/6/docs/api/java/security/KeyStore.html" rel="noreferrer">
KeyStore
并使用getCertificate
(然后getPublicKey()
表示公钥)和getKey()
PEMReader
。对于私钥,如果私钥受密码保护,您需要实现一个
PasswordFinder
(请参阅 PEMReader 文档中的链接)来构建PEMReader
。 (您需要将readObject()
的结果转换为Key
或PrivateKey
。)Your
.key
and.crt
files may be in PEM format. To check this open them with a text editor and check whether the content looks like------BEGIN CERTIFICATE------
(or "begin RSA private key"...). This is generally the default format used by OpenSSL, unless you've explicitly specified DER.It's probably not required (see below), but if your certificate is in DER format (a binary format), you can convert them in PEM format using:
(Check the help for
openssl rsa
for doing something similar with the private key if needed.)You then get two options:
Build a PKCS#12 file
You can then use it directly from Java as a keystore of type "PKCS12". Most Java applications should allow you to specify a keystore type in addition to the file location. For the default system properties, this is done with
javax.net.ssl.keyStoreType
(but the application you're using might not be using this). Otherwise, if you want to load it explicitly, use something like this:(Then, you should be able to iterate through the
aliases()
of theKeyStore
and usegetCertificate
(and thengetPublicKey()
for the public key) andgetKey()
.Use BouncyCastle's
PEMReader
.For the private key, you'll need to implement a
PasswordFinder
(see link from PEMReader doc) for constructing thePEMReader
if the private key is password-protected. (You'll need to cast the result ofreadObject()
into aKey
orPrivateKey
.)这应该做你想做的事情(使用上面建议的 BouncyCastle PEMReader)——获取 PEM 编码的私钥 + 证书,并输出 PKCS#12 文件。对用于保护私钥的 PKCS12 使用相同的密码。
This should do what you want to do (using the BouncyCastle PEMReader as suggested above) -- take a PEM-encoded private key + certificate, and output a PKCS#12 file. Uses the same password for the PKCS12 that was used to protect the private key.
看一下 org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
Take a look at org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
据我了解,OpenSSL 以所谓的 PEM 格式保存文件。您需要将其转换为 Java 密钥存储 (JKS) 格式,然后使用该格式(Java 本身的格式)来提取文件。如需转换,请使用此 Google 查询,它会提供相当不错的结果。
将 JKS 文件加载到 java.security.KeyStore 类。然后使用 getCertificate 和 getKey 方法获取所需的信息。
As I understand it, OpenSSL has saved files in so-called PEM format. You need to convert it to Java Key Storage (JKS) format, then work with that format (which is native to Java) to extract files. For conversion please use this Google query, it gives pretty good results.
Load the JKS file to java.security.KeyStore class. Then use getCertificate and getKey methods to get the needed information.