Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将证书从pem转换为jks_Java_Ssl_Certificate_Pem_Jks - Fatal编程技术网

Java 将证书从pem转换为jks

Java 将证书从pem转换为jks,java,ssl,certificate,pem,jks,Java,Ssl,Certificate,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格式的证书转换为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将其导入新的密钥库
  • 与第12页相同
  • 直接导入密钥库
我还试图改变现状

    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED 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-----

第一个问题:您只有一个证书请求?不是真正的证书? 它需要签名,您可以自行签名,也可以让外部人员签名

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

// 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不支持这一点,您也需要像bouncy castle这样的外部库。这并不容易。例如:

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

您不清楚合并了哪些文件,但它应该可以工作 使用openssl将证书和私钥组合到PKCS#12:

或在运行中,但(更新:)privatekey必须是第一个:

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

我有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
可以从CSR创建证书(这不是通过签署CSR来完成的,尽管很多人和网站错误地宣称这一点)自2011年Java 7以来。我将cert_public_key.pem和cert_private_key.pem组合到cert_comb.pem,我编辑了上面的帖子,并且我必须使用windows,所以我没有用cat进行复制。我在文本编辑器(notepad++)中手动复制了它我尝试合并这两个.pem文件并执行命令“pkcs12-export-out C:/path/cert.p12-in C:/path/cert_comb.pem”,但出现错误:“无法写入‘随机状态’”是的,Windows上的openssl通常在完成请求的操作后会出现此错误,因此在几乎所有情况下,您都可以忽略它。如果您想修复此错误,请参阅@Arash:假设您指的是一个文件中的证书(认证不是标准术语)和PEM格式的私钥,这正是我回答的第一部分中已经介绍过的情况。(请注意,此Q上的OP使用“cert_public_key”作为证书名称。)(请注意,与2014年不同,今天所有受支持的Java版本都默认使用PKCS12密钥库。)jamielinux.com上的这本指南有很多关于如何生成密钥对、如何生成证书、如何生成CSR、如何使用证书签署CSR的答案;之后,您可以使用keytool合并它们,也可以使用具有GUI的Portecle。
keytool -importkeystore -srckeystore cert.p12 -srcstoretype pkcs12 -destkeystore cert.jks 
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