Проблемы с установкой сертификата на nginix

Spread the love

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с 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
Была ли вам полезна эта статья?
[0 / 0]

Spread the love
Подписаться
Уведомление о
guest
0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments