簡體   English   中英

將證書從pem轉換為jks

[英]convert certificate from pem into 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-----

並嘗試了以上3種方式

我有什么辦法可以獲得工作證書?

編輯:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM