Проблемы с установкой сертификата на nginix
Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с Nginx. В этом процессе я столкнулся с несколькими проблемами, которые я опишу ниже, может кому то это поможет избежать подобных проблем.
И так первым делом я заказал новый сертификат у провайдера. Мне пообещали что он будет выпущен в течение 3 дней — 7 дней. Но прошло 7 дней а сертификата все нет и нет и каких либо сообщений об ошибках я то же ни получал. Я начал выяснять в чем может быть проблема. Обращение в тех. поддержку провайдера не помогло. Пришлось потратить несколько дней на поиск проблемы. Оказалось что если в доменной зоне существует хотя бы одна DNS запись типа CAA то сертификат может выдать только тот провайдер который прописан в этой записи. Я совсем забыл что год назад я создал эту запись для другого провайдера. В итоге создал новую запись CAA для нового провайдера, и сертификат пришел в течение дня по электронной почте.
Далее все просто, первым делом создадим текстовый файл your_domain.crt, который будет объединять три сертификата (сам SSL-сертификат, корневой и промежуточный сертификаты) в один файл. Поочередно скопируем и вставим в созданный документ каждый сертификат из электронного письма. После вставки всех сертификатов файл должен иметь вид:
-----BEGIN CERTIFICATE-----
#Ваш сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Промежуточный сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Корневой сертификат#
-----END CERTIFICATE-----
Далее создадим файл your_domain.key и скопируйте в него содержание приватного ключа сертификата так же из этого электронного письма.
В процессе этих действий я не заметил как совершил ошибку в одном из этих файлов, поэтому когда позже я попытался использовать эти сертификаты у меня ничего не получилось. В логе Ngnix я нашел следующую ошибку:
nginx: [emerg] SSL_CTX_use_PrivateKey_file(“/etc/ssl/your_domain.key”) failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
Основная причина этого сообщения об ошибке заключается в том, что закрытый ключ и сертификат не совпадают при попытке включить SSL в nginx. Чтобы проверить закрытый и открытый ключи, nginx сравнивает modulus каждого из них. Если они не совпадают, вы получите эту ошибку.
Получить modulus закрытого ключа (передав его через md5sum) можно следующей командой:
$ sudo openssl rsa -modulus -in /etc/ssl/your_domain.key -noout | md5sum
d41d8cd54f00b204e9800978ecf8427e -
И сравнить его с modulus из сертификата:
$ sudo openssl x509 -modulus -in /etc/ssl/your_domain.crt -noout | md5sum
f3a2f9186fcdcdf0d2235236f2ee9a26 -
Как видите, в моем случае дайджесты оказались разные. Получается как будто сертификат сгенерированный из другого ключа. Но также, эта ошибка возможна из-за неверного порядка следования сертификатов в файле crt, так как modulus будет рассчитываться из первого сертификата, найденного в файле.
После этого я еще раз все проверил, нашел ошибку в сертификате и после того как поправил ее все заработало.
Далее приведу минимальные настройки Nginx для установки сертификата:
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/ssl/your_domain.crt;
ssl_certificate_key /etc/ssl/your_domain.key;
}
Я это обычно не использую более расширенные настройки SSL, но если вы хотите дополнительно оптимизировать работу Nginx HTTPS-сервера, можно внести следующие настройки. SSL-операции задействуют дополнительные ресурсы сервера. Чтобы снизить количество операций, можно повторно использовать параметры SSL-сессий. Они хранятся в кеше SSL-сессий. Можно задать тип кеша (в примере это shared-кеш, разделяемый между всеми рабочими процессами) и его размер в байтах (в 1 Мб кеша помещается около 4000 сессий) с помощью директивы ssl_session_cache. Также можно увеличить таймаут кеша (время, в течение которого клиент повторно использует параметры сессии) директивой ssl_session_timeout: по умолчанию он равен 5 минутам. Можно настроить время работы одного keepalive-соединения с помощью директивы keepalive_timeout.
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
keepalive_timeout 70;
Можно дополнительно указать протоколы SSL, которые поддерживает сервер:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские, можно добавить следующую строку:
ssl_prefer_server_ciphers on;
Чтобы уменьшить время загрузки страниц у пользователей сайта, нужно разрешить серверу прикреплять OCSP-ответы для валидации сертификата. При этом необходимо указать путь к файлу корневого сертификата и DNS-сервер. Для этого создайте файл ca.crt и скопируйте в него содержимое корневого сертификата. Загрузите этот файл на сервер в директорию, где хранятся ранее созданные файлы. В нашем примере это /etc/ssl/. Затем добавьте в конфигурационном файле в секции server{} строки:
ssl_stapling on;
ssl_trusted_certificate /etc/ssl/ca.crt;
resolver 8.8.8.8;
Ну и в конце правок конечно же не забываем перезагрузить сервер Nginx:
$ sudo /etc/init.d/nginx restart