我必须将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-----
cert.txt
contains an 16 digit key
我尝试将pem文件合并(通过将两个文件组合在一起)并将其与openssl转换为
我也尝试改变
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----
进入
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
尝试了以上三种方式
我有什么办法可以获得工作证明?
编辑:
我将cert_public_key.pem和cert_private_key.pem组合到cert_comb.pem
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----
答案 0 :(得分:24)
你不清楚你合并了哪些文件,但它应该适用 使用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作为密钥库, 但是(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
答案 1 :(得分:1)
第一个问题:您只有证书申请?不是真正的证书? 它需要签名,您可以自签名或由外部方签名。
如果您拥有实际证书,则可以使用它来解析私钥文件和证书文件:
// 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也不支持这个,你需要一个像充气城堡这样的外部库。这并不容易。 E.g:
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);
}