Решили мы однажды, на одном из серверов, сайт на SSL перетащить, ибо неприлично в наше время на голом http сидеть.
Сказано – сделано, купили OV сертификат (с валидацией организации), и вот что это значит.
В нашем случае (сертификат был от comodo.com), обязательными условиями было:
- наличие электронной почты привязанной к домену (у нас не было, т.к. доменов у нас 2, и почта как раз на втором)
- наличие у организации страницы на одном из справочных ресурсов http://ru.kompass.com или http://www.dnb.com
- возможность ответить на звонок по номеру телефона указанному на странице организации в вышеуказанном справочнике
После оплаты счета, в личном кабинете, на сайте нашего регистратора, появилась возможность выпустить сертификат, для этого необходим CSR (Certificate Signing Request), создать его можно самому (openssl), либо с помощью мастера в личном кабинете. Я выбрал openssl.
CSR содержит открытый ключ, и информацию о организации, при этом, вместе с CSR, в отдельном файле, создается и закрытый ключ.
openssl req -new -key private.key -out domain-name.csr
данное заклинание попросит тебя ввести пароль для закрытого ключа (я его указал, но потом пришлось снимать). В моем случае, обязательными полями были:
- Country Name — двухсимвольный код страны согласно ISO-3166
- State or Province Name: название области или региона без сокращений
- Locality Name: название города или населенного пункта
- Organization Name: название организации в латинском эквиваленте
- Common Name: полностью определенное (FQDN) доменное имя
- Email Address: контактный e-mail адрес (необязательное, но я указал)
- A challenge password: не заполняется
В результате, были получены: закрытый ключ private.key, и CSR запрос domain-name.csr. Содержимое domain-name.csr вставил в форму в личном кабинете регистратора, и стал ждать проверку.
В подсказке в личном кабинете регистратора было сказано, что для проверки сертификата требуется почта в домене, на который выпускается сертификат. Соответственно при отправке CSR я указал ящик для каждого из сертификатов, причем для сертификата из домена mail.example.com, можно указать ящик в домене example.com.
На указанный ящик, мне прилетело письмо, вот такого содержания:
Необходимым условием выпуска сертификата стандартного уровня проверки является проверочный телефонный звонок из Центра сертификации на телефонный номер компании, которая заказывает сертификат.
Номер должен присутствовать на сайтах публичных телефонных справочниках:http://ru.kompass.com
http://www.dnb.com
К счастью, оказалось достаточно зарегистрироваться на ru.kompass.com, и указать, что являешься администраторм организации. Никаких проверок не делалось.
Следующим шагом, был проверочный звонок. В шпоргалке по выпуску сертификата от регистратора было указано, что позвонит какой-то чел, и будет разные вопросы задавать, как технического, так и административного содержания. Т.е. будет проверять, правда ли я сотрудник компании example corporation, и заказывал ли я сертификат в указанной конторе.
Оказалось все не так. Просто пришло письмо из comodo.com, со ссылкой, проследовав по которой попадаешь на страницу, где можно выбрать свой язык (на котором с тобой будут говорить), и ткнуть “call now”, при этом там указан номер телефона, который они получили из справочника организаций.
В моем случае, номер они распарсили неверно, и первой цифрой у них была 8, вместо +7, пришлось нажать “исправить номер”, и указав обоснование, ждать пока проверят. Т.к. сколько б я не тыкал “звонить”, дозвониться они не могли, ибо звонили из-за границы.
Соответственно дозвонился нам, как нетрудно догадаться – скрипт, и продиктовал 6 циферок, которые на той же странице нужно указать. Вот и вся проверка.
Сайт крутится на знаменитом дуэте nginx + apache, таким образом, сертификат прикручивался к nginx.
Из личного кабинета на сайте регистратора были скачаны:
- корневой сертификат root.crt
- два промежуточных сертификата intermediate1.crt и intermediate2.crt
- сертификат для домена example.com.crt
Все это хозяйство нужно собрать в один файл:
[root@example SSL_KEYS]# cat root.crt intermediate1.crt intermediate2.crt example.com.crt >> bundle.crt
и подключить к nginx, в моем случае
ssl_certificate /etc/nginx/ssl/bundle.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;
и вот тут приключились первые грабли, т.к. я делал все в точности по инструкции скачанной в техподдержке регистратора, то мысль, что что инструкция у них хреновая, пришла не сразу.
На проверку конфига “nginx -t” получал ошибку вида:
[emerg] 23348#0: PEM_read_bio_X509_AUX(“/etc/nginx/ssl/bundle.crt”) failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line)
как оказалось, это всего лишь, означает, что в файле bundle.crt, следует разделить строки, т.е. было:
—–END CERTIFICATE———-BEGIN CERTIFICATE—–
стало:
—–END CERTIFICATE—–
—–BEGIN CERTIFICATE—–
следующей печалью было несоответствие закрытого ключа сертификату:
[emerg] SSL_CTX_use_PrivateKey_file(“/etc/nginx/ssl/private.key”) failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
проверить ключ и сертификат на соответствие друг другу, можно так:
[root@example SSL_KEYS]# openssl pkey -in private.key -pubout -outform pem|md5sum
Enter pass phrase for ../private.key:
945574aa09fe008a454b75b2f148cad3 –
[root@example SSL_KEYS]# openssl x509 -in example.crt -pubkey -noout -outform pem|md5sum
945574aa09fe008a454b75b2f148cad3 –
Таким незамысловатым образом, легко сличить открытый ключ из файла private.key, и из сертификата. Если хэши совпадают, значит все ок.
данные заклинания подсмотрел вот тут: https://www.sslshopper.com/certificate-key-matcher.html
Похожим образом, можно сверить публичный ключ из CSR, и удостовериться, что вернули вам именно то, что вы отправляли:
openssl req -in example.csr -pubkey -noout -outform pem |md5sum
ну и под конец, nginx ругнулся, что ключ с паролем, изучать мануал на предмет “где в конфигах указать пароль” я не стал, т.к. сроки поджимали, просто снял его:
снять пароль с сертификата
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
после этого все заработало.