Как сгенерировать SSL-сертификат для хоста с очень длинным именем

Хоть и самоподписанный, то есть, запрос никому посылать не надо, всё своими руками делается, но вот оказалось, что если в имени хоста больше 64 символов, то openssl ругается на слишком длинную строку для CommonName, и сертификат не получается.

Я задал этот вопрос в ru_root, и там мне посоветовали для длинных имён использовать в сертификате не CN, а SAN (SubjectAltName) – дополнительное поле, которое существует в сертификатах 3 версии. Это оказалось не сильно просто, целый день потратил, многократно гуглив. Поэтому запишу подробности себе на память, ну и если ещё кому такое понадобится:

Итак, копируем стандартный /etc/ssl/openssl.cnf (например, в ./SAN.conf) и подправляем там следующие параметры:
1) в раздел req добавляем пару строчек:
[ req ]
prompt = no # чтоб использовались параметры из этого конфига, и ничего не перезапрашивалось
req_extensions = v3_req
x509_extensions = v3_ca # там уже есть

2) в раздел req_distinguished_name подписываем данные для генерации subject’а:
[ req_distinguished_name ]
C = две буквы названия страны
ST = штат/провинция/область
L = город
O = организация/компания
OU = отделение компании
CN = *.domain.com # это тот самый CommonName, сюда можно вписать основной домен, ну или просто какое-нибудь название

а стандартные параметры в этом разделе следует закомментировать, чтоб они не мешались.

3) в разделе [ req_attributes ] тоже всё закомментировать, оно не нужно.

4) в разделе v3_req первые две строчки уже есть, а вот subjectAltName надо добавить для генерации запроса на сертификат:
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

5) в разделе v3_ca закомментировать все стандартные параметры, и добавить то же самое, что в [ v3_req ], для генерации самого сертификата:
[ v3_ca ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

6) Добавить раздел [alt_names] со списком дополнительных доменных имён, которые могут быть длинными. Этот список используется в вышеописанных v3_req и v3_ca в виде @alt_names:
[alt_names]
DNS.1 = my.domain.com
DNS.2 = www.my.domain.com
DNS.3 = very-long-host-name.for-example-on.eu-west-1.elasticbeanstalk.com

Затем сгенерировать RSA-ключ:
openssl genrsa -out private.key 4096

Потом сгенерировать запрос на сертификат с этим ключом, используя вышеописанный конфиг, и явно указывая на его раздел v3_req:
openssl req -new -key private.key -out cert.csr -days 3650 -config ./SAN.cnf -extensions v3_req

А потом уже сгенерировать сам сертификат из этого запроса, подписав его своим же ключом, используя тот же конфиг, и указывая на его раздел v3_ca:
openssl x509 -req -in cert.csr -signkey private.key -days 3650 -out cert.crt -extfile ./SAN.cnf -extensions v3_ca


You can read this post at LiveJournal.
This entry was posted in Uncategorized and tagged , , . Bookmark the permalink.

Leave a Reply