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

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

Чтобы использовать это с tomcat на сервере Windows

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

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

person Narf    schedule 10.03.2014    source источник
comment
В этом руководстве на сайте jamielinux.com есть много ответов о том, как сгенерировать пару ключей, как сгенерировать сертификат, как сгенерировать CSR, как подписать CSR с помощью сертификата; после этого вы можете либо использовать keytool, чтобы объединить их, либо использовать Portecle, у которого для этого есть графический интерфейс. jamielinux.com/docs/openssl-certificate-authority/   -  person EpicPandaForce    schedule 03.02.2016


Ответы (2)


Вам неясно, какие файлы вы объединили, но использование 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 

Если вашему сертификату нужны какие-либо цепные сертификаты - 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
person dave_thompson_085    schedule 10.03.2014
comment
Я объединил cert_public_key.pem и cert_private_key.pem в cert_comb.pem, я отредактировал сообщение выше - person Narf; 10.03.2014
comment
и мне нужно использовать окна, поэтому я не копировал это с помощью cat. Скопировал вручную в текстовом редакторе (блокнот ++) - person Narf; 10.03.2014
comment
Я попытался объединить два файла .pem и выполнить команду pkcs12 -export -out C: /path/cert.p12 -in C: /path/cert_comb.pem, но я получаю сообщение об ошибке: невозможно записать «случайное состояние» - person Narf; 10.03.2014
comment
Да, openssl в Windows часто выдает эту ошибку после завершения запрошенной операции, поэтому почти во всех случаях вы можете игнорировать ее. Если вы хотите исправить, см. stackoverflow.com/questions/12507277/ stackoverflow.com/questions/94445/ - person dave_thompson_085; 11.03.2014
comment
Привет, есть ли способ преобразовать PEM в PKCS12 (или JKS) без использования openssl? - person Zippon; 13.11.2017
comment
@Zippon: Политика StackOverflow (и StackExchange) не заключается в том, чтобы задавать (или отвечать) вопросы в комментариях, которые часто удаляются. Однако: если вы имеете в виду PEM, содержащий закрытый ключ и сертификат (а) (а это далеко не все файлы PEM), и у вас есть Java (подразумевается JKS) и BouncyCastle (не подразумевается), см. stackoverflow.com/q/22963581 stackoverflow.com/q/1580012 stackoverflow.com/q/6482484 безопасность. stackexchange.com/q/9600, затем сохраните в JCA. В противном случае вы можете сами запрограммировать те же алгоритмы, но это потребует исследования и правильного вопроса. - person dave_thompson_085; 14.11.2017
comment
как я могу преобразовать мой файл sslcertification.pem, содержащий сертификат и закрытый ключ вместе, в хранилище ключей? - person Arash; 21.01.2019
comment
@Arash: предполагая, что вы имеете в виду сертификат (сертификация не является стандартным термином) и частный ключ в формате PEM в одном файле, это именно тот случай, который уже описан в первой части моего ответа. (Обратите внимание, что OP в этом Q использовал имя cert_public_key для сертификата.) (Также обратите внимание, что сегодня, в отличие от 2014, все поддерживаемые версии Java по умолчанию используют хранилище ключей PKCS12.) - person dave_thompson_085; 22.01.2019

Первый вопрос: у вас есть только запрос на сертификат? Не настоящий сертификат? Он должен быть подписан, вы можете подписать его самостоятельно или попросить подписать стороннее лицо.

Если у вас есть настоящий сертификат, вы можете использовать его для анализа файла закрытого ключа и файла сертификата:

// 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 не поддерживает это, вам нужна внешняя библиотека, например надувной замок. Это непросто. Например:

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);
}
person nablex    schedule 10.03.2014
comment
У меня есть 4 файла: cert_request.csr, cert_public_key.pem, cert_private_key.pem и cert.txt. - person Narf; 10.03.2014
comment
Cert.txt состоит только из 16 цифр, не знаете, что он содержит, идентификатор? Открытый ключ здесь не важен. CSR (запрос на подпись сертификата) должен быть подписан кем-то для создания сертификата. Сертификат и закрытый ключ помещаются вместе в хранилище ключей. CSR можно игнорировать после того, как он был подписан. - person nablex; 10.03.2014
comment
ладно насколько понял, а как? я ищу выражение командной строки - person Narf; 10.03.2014
comment
как мне запустить этот код? пожалуйста, помогите мне. У меня есть файл sslcertification.pem, содержащий сертификат и закрытый ключ, которые я хочу преобразовать в формат хранилища ключей Java? - person Arash; 21.01.2019
comment
Данные в Q ясно показали, что cert_public_key.pem на самом деле был сертификатом. Хотя здесь это не применимо, keytool -gencert может создать сертификат из CSR (что НЕ выполняется путем подписания CSR, хотя многие люди и сайты ошибочно заявляют об этом), начиная с Java 7 в 2011 году. - person dave_thompson_085; 10.03.2021