Debian.pro

Блог для пользователей и администраторов Debian


Выцепляем ca-bundle для ssl-сертификата.

Частенько случается такое, что у вас на руках есть только сам сертификат и ключ. Ну там клиент прислал. Для корректной же настройки https нужен ещё и т.н. «CA Bundle» (или по-простому — цепочка сертификатов вплоть до корневого).
Ещё чаще клиент не знает, что это за сертификат, откуда он его взял, а уж тем более ничего не знает про то, где взять bundle для него. Многие админы начинают выяснять у кого этот сертификат куплен, эмпирически пытаться найти цепочки, ну и другие глупости делать.

Адекватный сисадмин же знает, что у любого сертификата, кроме корневого, есть поле CA Issuers, в котором можно посмотреть, каким сертификатом подписан текущий. Ну а дальше, имея эту информацию, можно построить цепочку, используя только openssl, да wget/curl.

Для примера я взял бесплатный StartSSL-евский сертификат, у которого цепочка весьма длинная.
Допустим, мы его получили сразу в PEM-формате (то есть обычном текстовом — в моём примере это файл debian.pro.crt), чуть ниже будет пример того, как сертификат можно превратить в PEM. Погнали:

user@server:~$ openssl x509 -in debian.pro.crt -text | grep 'CA Issuers'
    CA Issuers - URI:http://aia.startssl.com/certs/sub.class1.server.ca.crt

Окей, первым сертификатом в CA Bundle станет http://aia.startssl.com/certs/sub.class1.server.ca.crt. Качаем его:

user@server:~$ wget http://aia.startssl.com/certs/sub.class1.server.ca.crt

Получим файл sub.class1.server.ca.crt в DER-формате. Чтобы его можно было скормить в nginx/apache/whatever, нужно конвертировать его в PEM:

user@server:~$ openssl x509 -in sub.class1.server.ca.crt -inform DER -outform PEM -out sub.class1.server.ca.pem.crt

Продолжаем строить цепочку.

user@server:~$ openssl x509 -in sub.class1.server.ca.pem.crt -text | grep 'CA Issuers'
    CA Issuers - URI:http://aia.startssl.com/certs/ca.crt

Опять качаем http://aia.startssl.com/certs/ca.crt, конвертируем его в pem. У меня получился файл ca.pem.crt. Пытаемся построить цепочку дальше:

user@server:~$ openssl x509 -in ca.pem.crt -text | grep 'CA Issuers'

В ca.pem.crt уже нет поля Issuers, т.к. это «корневой» сертификат, никем не подписанный — его добавляют в доверенные уже на клиентах (в браузере, в системе). Единственная оговорка, что бывают кросс-подписанные сертификаты, в таком случае у вас на каждый следующий сертификат будут чередоваться 2 сертификата в Issuers — тогда просто остановитесь на самом первом из них.

Осталась самая мелочь — подготовить crt-файл для apache/nginx.
Для nginx я делаю так:

user@server:~$ cat debian.pro.key debian.pro.crt sub.class1.server.ca.pem.crt ca.pem.crt > debian.pro.pem

Для апача старых версий придется держать отдельные файлы (но ca-bundle нужно собрать в один файл):

user@server:~$ cat sub.class1.server.ca.pem.crt ca.pem.crt > debian.pro.ca.pem

Всё. Занимает секунд 30 и не нужно лишних писем и ожиданий ;)


Комментарии (5):

  1. Корневой сертификат не должен устанавливаться на сервер. Только промежуточные и серверный. Здесь https://community.qualys.com/thread/11026 объясняется почему. Если есть другие аргументы в пользу установки корневого сертификата на сервер, пожалуйста поделитесь. Кстати, стандартный файлик StartCom для nginx’а содержит два сертификата, а не три.

  2. > не должен
    Не «не должен», а «не обязателен». Ну или «не рекомендуется». Те, у кого 1k+ hps, и так в курсе, а остальным — в целом наплевать =)

  3. Я заметил, что у наших обычно есть (даже с 1k+), а у буржуев нет. Просто стало интересно, а внятной инфы на русском не так много.

  4. Людей с 1k+ hps в рунете не так много на самом деле, из них никто бложики толком не ведет, доки в паб не пишет.
    У меня при 30-40к RPS тысячи шейков не было, к слову (из-за кешей).

  5. Меня интересовала культурная установка сертификата, про производительность я даже не думал.

Написать комментарий