Как создать цепочку сертификатов?

Установка сертификатов не всегда простая задача. Обычно проблемы возникают, когда у вас один или более объединенных в цепь промежуточных сертификатов.

Одна из часто возникающих проблем - это установленная на сервер неполная цепочка сертификатов, что приводит к ошибке:

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