преобразование сертификата из pem в jks

Я должен преобразовать сертификат в формате pem в хранилище ключей java.

использовать этот с tomcat на сервере windows

у меня есть эти файлы:

  • cert_request.КСО

    -----BEGIN CERTIFICATE REQUEST-----
    ...
    -----END CERTIFICATE REQUEST-----
    
  • cert_public_key.Пем!--8-->

    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    
  • cert_private_key.Пем!--8-->

    -----BEGIN ENCRYPTED PRIVATE KEY-----
    ...
    -----END ENCRYPTED PRIVATE KEY-----
    
  • верняк.txt

    contains an 16 digit key
    

Я попытался объединить файлы pem (путем объединения двух файлов были цепочкой вместе) и преобразовали это с openssl в

  • .der-файл и импортируйте его с помощью keytool в новое хранилище ключей
  • же .Р12
  • непосредственно импортируется в keystore

Я также попытался изменить

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

на

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

и попробовал 3 пути выше

что мне делать, чтобы я получил работу сертификат?

EDIT:

Я combinied в cert_public_key.pem и ключ cert_private_key.pem-cert_comb.Пем!--8-->

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

2 ответов


вы не ясно, какие файлы вы объединили, но он должен работать, чтобы используйте openssl для объединения сертификата и закрытого ключа в PKCS#12:

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

или на лету, но (update:) privatekey должен быть первым:

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

если вашему сертификату нужен любой цепной сертификат(ы) -- CA должен был сказать вам это, когда вы представили КСО, и они выдали сертификат - проще всего также включить его (их) сейчас.

затем (1) некоторые программы Java могут фактически использовать формате pkcs12 в хранилище, но (2) Если вам нужен или предпочитаете JKS, используйте keytool:

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

если вы заботитесь о псевдониме в результирующем JKS, проще всего исправить его после преобразования.

также: просто изменение меток в зашифрованном PEM не расшифровывает его и не изменяет метка от generic PKCS#8 до RSA фактически изменяет данные на соответствие (и они отличаются, хотя и немного). Если вам нужен отдельный файл PEM с расшифрованным private ключ:

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

обновление

насколько я знаю, 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);
}