将证书从pem转换为jks

我必须将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转换成一个

  • .der文件并使用keytool将其导入新的密钥库
  • 与.p12相同
  • 直接导入到密钥库

我也试着改变了

  -----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----- 

您不清楚合并了哪些文件,但是应该使用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 

如果您的证书需要任何连锁证书 – 当您提交CSR并且他们颁发证书时,CA应该告诉您这一点 – 现在最容易包括它(他们)。

然后(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 

第一个问题:您只有证书申请? 不是真正的证书? 它需要签名,您可以自签名或由外部方签名。

如果您有实际的证书,则可以使用它来解析私钥文件和证书文件:

 // 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 }); 

UPDATE

据我所知,命令行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); }