将证书从 pem 转换为 jks
Posted
技术标签:
【中文标题】将证书从 pem 转换为 jks【英文标题】:convert certificate from pem into jks 【发布时间】:2014-04-13 07:53:19 【问题描述】:我必须将 pem 格式的证书转换为 java 密钥库。
在 Windows 服务器上将这个与 tomcat 一起使用
我有这些文件:
cert_request.csr
-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----
cert_public_key.pem
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
cert_private_key.pem
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----
证书.txt
contains an 16 digit key
我尝试合并 pem 文件(通过将两个文件链接在一起)并使用 openssl 将其转换为
.der 文件并使用 keytool 将其导入新的密钥库 与 .p12 相同 直接导入密钥库我也尝试过改
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----
进入
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
并尝试了上面的 3 种方法
我该怎么做才能获得工作证书?
编辑:
我将 cert_public_key.pem 和 cert_private_key.pem 合并到 cert_comb.pem
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----
【问题讨论】:
jamielinux.com 上的这个指南有很多关于如何生成密钥对、如何生成证书、如何生成 CSR、如何使用证书签署 CSR 的答案;之后,您可以使用 keytool 合并它们,也可以使用具有 GUI 的 Portecle。 jamielinux.com/docs/openssl-certificate-authority/… 【参考方案1】:您不清楚合并了哪些文件,但它应该可以 使用 openssl 将证书和私钥组合到 PKCS#12:
cat cert_public_key.pem cert_private_key.pem >combined.pem
openssl pkcs12 -export -in combined.pem -out cert.p12
或在运行中,但(更新:)私钥必须是第一个:
cat cert_private_key.pem cert_public_key.pem | openssl pkcs12 -export -out cert.p12
如果您的证书需要任何链式证书 - CA 应该在您提交时告诉您这一点 CSR 和他们颁发的证书——现在最容易也包括它(他们)。
那么(1)一些 Java程序实际上可以直接使用一个pkcs12作为keystore, 但是 (2) 如果您需要或更喜欢 JKS,请使用 keytool:
keytool -importkeystore -srckeystore cert.p12 -srcstoretype pkcs12 -destkeystore cert.jks
如果您关心生成的 JKS 中的别名,最容易在转换后修复它。
另外:仅更改加密 PEM 中的标签并不会取消加密,更改也不会 从通用 PKCS#8 到 RSA 的标签实际上会更改数据以匹配(它们是不同的, 虽然只有一点)。如果您确实想要一个带有解密私钥的单独 PEM 文件:
openssl pkey -in encryptedpk8 -out clearpk8.pem # 1.0.0 up
openssl pkcs8 -in encryptedpk8 -out clearpk8.pem # 1.0.0 up
openssl pkcs8 -topk8 -nocrypt -in encryptedpk8 -out clearpk8.pem # below 1.0.0
openssl rsa -in encryptedpk8 -out clearrsa.pem
【讨论】:
我将 cert_public_key.pem 和 cert_private_key.pem 合并到 cert_comb.pem,我编辑了上面的帖子 我必须使用 windows,所以我没有用 cat 复制这个。我在文本编辑器(记事本++)中手动复制了它 我尝试合并两个 .pem 文件并执行命令“pkcs12 -export -out C:/path/cert.p12 -in C:/path/cert_comb.pem”,但我得到了错误:“无法写入‘随机状态’” 是的,Windows 上的 openssl 在完成请求的操作后经常会出现该错误,因此在几乎所有情况下您都可以忽略它。如果要修复,请参阅***.com/questions/12507277/… ***.com/questions/94445/… @Arash:假设您的意思是一个文件中的 PEM 格式的证书(证书不是标准术语)和私钥,这正是我的答案的第一部分已经涵盖的情况。 (请注意,此 Q 上的 OP 使用名称“cert_public_key”作为证书。)(另请注意,与 2014 年不同,今天所有受支持的 Java 版本默认为 PKCS12 密钥库。)【参考方案2】:第一个问题:你只有一个证书请求?不是真正的证书? 需要签名,可以自签名也可以让外部签名。
如果你有实际的证书,你可以用它来解析私钥文件和证书文件:
// parse the private key
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); // might not be RSA
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(byteArray);
PrivateKey privateKey = keyFactory.generatePrivate(spec);
// parse cert
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate cert = factory.generateCertificate(certInputStream);
// add it to the keystore
store.setKeyEntry(alias, privateKey, password, new X509Certificate[] cert );
更新
据我所知,命令行 keytool 不支持任何高级选项,例如签署 csr。即使是标准的 java 也不支持这个,你需要一个像充气城堡这样的外部库。这并不容易。例如:
JcaPKCS10CertificationRequest pkcs10 = new JcaPKCS10CertificationRequest(csrBytes);
X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
issuer,
generateSerialId(),
new Date(),
until,
subject,
pkcs10.getPublicKey()
);
X509CertificateHolder holder = builder.build(getContentSigner(privateKey, type));
X509Certificate cert = getCertificate(holder);
...
ContentSigner getContentSigner(PrivateKey privateKey)
AsymmetricKeyParameter keyParameter = PrivateKeyFactory.createKey(privateKey.getEncoded());
AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA256WITHRSA"); // or what you want
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
return new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(keyParameter);
【讨论】:
我有 4 个文件,一个 cert_request.csr、cert_public_key.pem、cert_private_key.pem 和 cert.txt。 cert.txt 只有 16 位数字,不知道其中包含什么,一个 id?公钥在这里并不重要。 csr(证书签名请求)必须由某人签名才能生成证书。证书和私钥一起进入密钥库。 csr 签名后可以忽略。 好吧,目前了解,但是如何?我正在寻找一个命令行表达式 我应该如何运行这段代码?请帮我。我有一个包含证书和私钥的 sslcertification.pem 文件,我想将其转换为 java 密钥库格式? Q中的数据清楚地表明'cert_public_key.pem'实际上是一个证书。尽管此处不适用,keytool -gencert
可以从 2011 年 Java 7 开始从 CSR 创建证书(这不是通过签署 CSR 来完成的,尽管很多人和网站错误地声称这一点)。以上是关于将证书从 pem 转换为 jks的主要内容,如果未能解决你的问题,请参考以下文章