Добавление цепочки сертификатов в сертификат p12 (pfx)

У меня есть приложение в java и cxf, которое подключается к WebServices с сертификатом клиента.

Я получил сертификаты от владельца WebService

  • certificate.p12
  • certificate.pem
  • certificate.crt
  • trusted_ca.cer
  • root_ca.cer

У меня есть проблема с простым преобразованием этого p12 certficate в рабочую jks keystore, требуемую java.

Я сделал это:

keytool -importkeystore -srckeystore certificate.p12 -srcstoretype PKCS12 -destkeystore certificate1.jks -deststoretype JKS -storepass secret
keytool -import -alias root -file root_ca.cer -trustcacerts -keystore certificate1.jks -storepass secret
keytool -import -alias trusted -file trusted_ca.cer -trustcacerts -keystore certificate1.jks -storepass secret

но этот jks не работает, и я получаю HTTP-ответ "403: Запрещено" при использовании этого сертификата1.jks

Однако, если я импортирую этот сертификат p12 (pfx) в Internet Explorer и затем экспортирую этот сертификат из IE в формат pfx, установите флажок "Включить все сертификаты в путь сертификации" и используйте:

keytool -importkeystore -srckeystore certificate.pfx -srcstoretype PKCS12 -destkeystore certificate2.jks -deststoretype JKS -storepass secret
keytool -import -alias root -file root_ca_kir.cer -trustcacerts -keystore certificate2.jks -storepass secret
keytool -import -alias trusted -file trusted_ca_kir.cer -trustcacerts -keystore certificate2.jks -storepass secret

Затем все работает нормально, и я могу подключиться к WebService, используя сертификат 2.js.

Я обнаружил, что исходный сертификат .p12 (pfx) содержит только одну запись (длина цепи сертификата: 1):

keytool -list -keystore certificate.p12 -storepass secret -storetype PKCS12 -v


*******************************************
*******************************************

Alias name: alias
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=MyCompany, [email protected], O=bla, C=PL
Issuer: CN=Trusted CA, O=ble, C=PL
Serial number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from: ... until: ...
Certificate fingerprints:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:

#1: ObjectId: X.X.XX.XX Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

...

*******************************************
*******************************************

в то время как сертификат .pfx, экспортированный из IE с "Включить все сертификаты в пути сертификации", содержит цепочку сертификатов со вторым сертификатом доверенного ЦС (длина цепи сертификата: 2):

keytool -list -keystore certificate.p12 -storepass secret -storetype PKCS12 -v



*******************************************
*******************************************

Alias name: alias
Entry type: PrivateKeyEntry
Certificate chain length: 2
Certificate[1]:
Owner: CN=MyCompany, [email protected], O=bla, C=PL
Issuer: CN=Trusted CA, O=ble, C=PL
Serial number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from: ... until: ...
Certificate fingerprints:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:

#1: ObjectId: X.X.XX.XX Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

...

Certificate[2]:
Owner: CN=Trusted CA, O=ble ble ble, C=PL
Issuer: CN=ROOT CA, O=ble ble ble, C=PL
Serial number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Valid from: ... until: ...
Certificate fingerprints:
         MD5:  XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
         Signature algorithm name: SHA1withRSA
         Version: 3

Extensions:


*******************************************
*******************************************

Итак, чтобы решить мою проблему, мне нужно иметь сертификат p12 с доверенным сертификатом CA. Я могу сделать это, импортировав p12 в IE и затем экспортируя обратно с помощью "Включить все сертификаты в путь сертификации".

Как я могу сделать это без IE с помощью keytool или другого инструмента?

Bary

Ответ 1

Собственный ответ.

Я понял, как это сделать с OpenSSL:

openssl pkcs12 -in certificate.p12 -out clientcert.pem -nodes -clcerts
openssl x509 -in trusted_ca.cer -inform DER -out trusted_ca.pem
openssl x509 -in root_ca.cer -inform DER -out root_ca.pem
cat clientcert.pem trusted_ca.pem root_ca.pem >> clientcertchain.pem
openssl pkcs12 -export -in clientcertchain.pem -out clientcertchain.pfx

Ответ 2

Если вы работаете в ОС Windows, вы можете установить сертификат как обычно через IIS, затем открыть mmc.exe → Файл → Добавить/Удалить оснастку → Дважды щелкните "Сертификаты", выберите "Учетная запись компьютера", затем нажмите хорошо, хорошо

enter image description here

Разверните сертификаты, при необходимости добавьте сертификаты из ЦС в "Промежуточные центры сертификации" или "Доверенные корневые центры сертификации".

enter image description here

Затем перейдите в "Веб-хостинг", здесь должны быть ваши сертификаты веб-сайта, выберите сертификат, щелкните его левой кнопкой мыши, выберите "Экспорт" и следуйте указаниям мастера. Важные вещи, которые необходимо проверить: "Включить закрытый ключ", Включить все сертификаты в цепочку, экспортировать все расширенные свойства, вы должны установить пароль, выбрать имя выходного файла и это все. Теперь у вас есть сертификат с полной цепочкой. Больше никаких проблем с Facebook или подобным.