web-dev-qa-db-fra.com

convertir le certificat de pem en jks

Je dois convertir un certificat au format pem en un magasin de clés Java.

Pour utiliser celui-ci avec Tomcat sur un serveur Windows

J'ai ces fichiers:

  • 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
    

J'ai essayé de combiner les fichiers pem (en combinant les deux fichiers étaient enchaînés) et converti cela avec openssl en un

  • fichier .der et importez-le avec keytool dans un nouveau magasin de clés
  • idem avec .p12
  • directement importé dans le magasin de clés

J'ai aussi essayé de changer le

    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED PRIVATE KEY-----

dans

    -----BEGIN RSA PRIVATE KEY-----
    ...
    -----END RSA PRIVATE KEY-----

et essayé les 3 façons ci-dessus

que dois-je faire pour obtenir un certificat de travail?

ÉDITER:

J'ai combiné le cert_public_key.pem et le cert_private_key.pem à cert_comb.pem

    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED PRIVATE KEY-----
12
Narf

Vous ne savez pas quels fichiers vous avez combinés, mais cela devrait fonctionner pour utiliser openssl pour combiner le certificat et la clé privée à un PKCS # 12:

cat cert_public_key.pem cert_private_key.pem >combined.pem
openssl pkcs12 -export -in combined.pem -out cert.p12

ou à la volée mais (mise à jour :) la clé privée doit être la première:

cat cert_private_key.pem cert_public_key.pem | openssl pkcs12 -export -out cert.p12 

Si votre certificat a besoin de certificats de chaîne - l'autorité de certification aurait dû vous le dire lorsque vous avez soumis le CSR et qu'ils ont émis le certificat - il est plus facile de les inclure également maintenant.

Alors (1) certains Java peuvent réellement utiliser un pkcs12 directement comme magasin de clés, mais (2) si vous avez besoin ou préférez un JKS, utilisez keytool:

keytool -importkeystore -srckeystore cert.p12 -srcstoretype pkcs12 -destkeystore cert.jks 

Si vous vous souciez de l'alias dans le JKS résultant, il est plus facile de le corriger après la conversion.

De plus: le simple changement des étiquettes dans un PEM chiffré ne le déchiffre pas, et le changement d'étiquette de PKCS # 8 générique en RSA ne change en fait pas les données pour qu'elles correspondent (et elles sont différentes, bien que peu). Si vous voulez un fichier PEM séparé avec la clé privée déchiffrée:

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

Première question: vous n'avez qu'une demande de certificat? Pas un vrai certificat? Il doit être signé, vous pouvez vous auto-signer ou le faire signer par une partie externe.

Si vous disposez du certificat réel, vous pouvez l'utiliser pour analyser le fichier de clé privée et le fichier de certificat:

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

MISE À JOUR

Pour autant que je sache, l'outil de ligne de commande ne prend en charge aucune option avancée comme la signature d'un csr. Même le standard Java ne le supporte pas, vous avez besoin d'une bibliothèque externe comme un château gonflable. Ce n'est pas facile. Par exemple:

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