Как создать хранилище сертификатов VeriSign с помощью OpenSSL?

Добрый день.

Имеется три файла: запрос сертификата, приватный ключ и сам сертификат, подписанный VeriSign. Мне необходимо добавить это всё в Java Key Store, чтобы использовать в Tomcat-приложении. Проблема в том, что запрос был выписан с помощью OpenSSL, а keytool, похоже, не умеет импортировать ключи. Поэтому решил сначала экспортировать сертификат в хранилище формата PKCS12 с помощью OpenSSL, а потом импортировать это хранилище в Java Key Store. Но вот незадача — когда пытаюсь экспортировать сертификат в хранилище с созданием цепочки (chain) с помощью команды
openssl pkcs12 -export -in certificate.cer -inkey key.pem -out keystore.p12 -chain -CAfile ca.pem
(файл ca.pem содержит оба intermediate-сертификата VeriSign, а также все pem-файлы корневых серверов VeriSign, которые нашёл в архиве roots.zip на их сайте)
получаю сообщение об ошибке:
Error unable to get local issuer certificate getting chain.
Также пробовал добавлять intermediate-сертификаты в директорию /etc/ssl/certs/ с созданием правильных симлинков (имя файла симлинка = хеш сертификата + .0), ошибка не исчезла.
Подскажите, какой сертификат и куда надо добавить, чтобы команда выполнилась?

P.S. значение Issuer сертификата:
Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=Terms of use at www.verisign.com/rpa ©10, CN=VeriSign Class 3 International Server CA — G3
  • Вопрос задан
  • 8093 просмотра
Пригласить эксперта
Ответы на вопрос 4
@XoJIoD Автор вопроса
Прошу прощения, не вставилось значение Issuer:
Issuer: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=Terms of use at www.verisign.com/rpa ©10, CN=VeriSign Class 3 International Server CA — G3
Ответ написан
Комментировать
Maximus43
@Maximus43
Все просто. В PKCS12 не надо вставлять цепочку сертификатов. Это можно сделать на этапе формирования JKS.
Создать PKCS12:
openssl pkcs12 -export -in webserver.cer -inkey webserver.pem -out webserver.p12
Создаем хранилище сертификатов JKS и импортируем туда наши данные
# keytool -v -importkeystore -srckeystore webserver.p12 -srcstoretype PKCS12 -destkeystore tomcat.jks -deststoretype JKS
Копируем сертификат внешнего CA (назовем его CA_cert.cer)
# scp<источник>:CA_cert.cer .
Устанавливаем его в оба локальных хранилища
# keytool -import -alias cacert-file CA_cert.cer -keystore tomcat.jks
# keytool -import -trustcacerts -file CA_cert.cer -keystore truststore.jks -storepass <пароль для JKS> -alias externalca

Присваиваем права доступа
# chmod +x *.jks

Все.
Ответ написан
Maximus43
@Maximus43
Походу это из-за отсутствия расширения Authority Key Identifier. keytool просто не может связать конечный сертификат с выпускающим CA. В Windows CryptoAPI есть несколько типов сопоставления издателя: через Authority Key Identifier, через Issuer's DN и т.п. Поэтому в Windows такой сертификат может и заработает, но нет гарантии. Вот что пишет по поводу Authority Key Identifier стандарт RFC 5280:

The keyIdentifier field of the authorityKeyIdentifier extension MUST
be included in all certificates generated by conforming CAs to
facilitate certification path construction. There is one exception;
where a CA distributes its public key in the form of a «self-signed»
certificate, the authority key identifier MAY be omitted. The
signature on a self-signed certificate is generated with the private
key associated with the certificate's subject public key. (This
proves that the issuer possesses both the public and private keys.)
In this case, the subject and authority key identifiers would be
identical, but only the subject key identifier is needed for
certification path building.

У вас сертификат содержит следующие расширения:

X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 CRL Distribution Points:

Full Name:
URI:http://SVRIntl-G3-crl.verisign.com/SVRIntlG3.crl

X509v3 Certificate Policies:
Policy: 2.16.840.1.113733.1.7.23.3
CPS: www.verisign.com/rpa

X509v3 Extended Key Usage:
Netscape Server Gated Crypto, TLS Web Server Authentication, TLS Web Client Authentication
Authority Information Access:
OCSP - URI:http://ocsp.verisign.com
CA Issuers - URI:http://SVRIntl-G3-aia.verisign.com/SVRIntlG3.cer

1.3.6.1.5.5.7.1.12:
0`.^.\0Z0X0V..image/gif0!0.0...+......Kk.(.....R8.).K..!..0&.$http://logo.verisign.com/vslogo1.gif


Не хватает

X509v3 Authority Key Identifier:
keyid:D7:9B:7C:D8:22:A0:15:F7:DD:AD:5F:CE:29:9B:58:C3:BC:46:00:B5

Вот такие у меня мысли.
Ответ написан
Maximus43
@Maximus43
А вам именно JKS надобно? Или цель просто настроить SSL под Apache? Просто для SSL не обязательно использовать JKS.
И вообще проблема лежит несколько в другой плоскости. Для сопоставления издателя и конечного сертификата используют раздичные способы: Exact match, Key match, Name match. Первые два способа требуют расширение Authority Key Identifier. Значит остается только Name match. Похоже, что keytool строить цепочки в режиме Name match не умеет. Следовательно от JKS ничего не зависит, надо подкручивать клиета, использующего JKS таким образом, чтобы он смог построить всю цепочку от начала до конца.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы