Как создать цепочку сертификатов?
Установка сертификатов не всегда простая задача. Обычно проблемы возникают, когда у вас один или более объединенных в цепь промежуточных сертификатов.
Одна из часто возникающих проблем - это установленная на сервер неполная цепочка сертификатов, что приводит к ошибке:
x509: certificate signed by unknown authority or server certificate verification failed
При этом браузер, при обращении к сайту по HTTPS протоколу, может не показывать ошибку, т.к. браузеры умеют автоматически дополнять цепочку сертификатов (из своего встроенного хранилища сертификатов или из хранилища операционной системы).
Делаем правильную цепочку сертификатов
Если у вас есть промежуточные сертификаты, то нужно убедится, что при ответе на запрос браузера или другого http-клиента, сервер, отправляет полную цепочку сертификатов. Цепочка должна содержать сертификат домена и все промежуточные сертификаты, при этом сертификат домена должен идти первым, как на картинке:
Сначала давайте убедимся что у нас есть все необходимые файлы:
- корневой сертификат (CA certificate, обычно файл называется ca.pem или cacerts.pem)
- промежуточный сертификат (Intermediate certificate, его может не быть совсем или их может быть несколько)
- сам сертификат домена
Далее в примерах мы будем использовать следующие имена файлов:
- корневой сертификат:
ca.pem
- промежуточный сертификат:
intermediate.pem
- сертификат домена:
cert.pem
Теперь, когда у нас есть все необходимое, перейдем в папку с файлами и объединим сертификат домена и промежуточный сертификат в один файл следующей командой (не забудьте заменить имена файлов из примера на соответствующие имена ваших файлов):
$ cat cert.pem intermediate.pem > chain.pem
Проверить правильность порядка следования сертификатов в цепочке мы можем так, выполняем команду:
$ openssl crl2pkcs7 -nocrl -certfile chain.pem | openssl pkcs7 -print_certs -noout
вывод будет примерно такой:
subject=/C=Countrycode/ST=State/O=Organization/CN=FQDN
issuer=/C=Countrycode/ST=State/O=Organization/CN=the name of the intermediate CA
subject=/C=Countrycode/ST=State/O=Organization/CN=the name of the intermediate CA
issuer=/C=Countrycode/ST=State/O=Organization/CN=the name of the CA
в поле CN мы должны увидеть:
- subject: домен, на который выдан сертификат
- issuer: имя промежуточного сертификата
- subject: имя промежуточного сертификата, которое должно совпадать со значение в поле
issuer
предидущего сертификата - issuer: имя корневого сертификата
Если описанные выше условия выполняются, то цепочка сертификатов сделана правильно!
Промежуточных сертификатов может быть больше одного, в этом случае в файл должны быть добавлены все промежуточные сертификаты, по тому же принципу:
поле subject
каждого следующего сертификата должно соответствовать полю issuer
предидущего сертификата. Получить поле issuer
можно следующей командой:
openssl x509 -in cert.pem -noout -issuer
Статья написана на основе материалов из поста Get your certificate chain right