Есть множество центров сертификации, которые ищутся по запросу "купить ssl сертификат".
Существует три уровня сертификатов, которые отличаются скрупулезностью проверки запросившей сертификат организации и, соответственно, стоимостью (в несколько раз). При этом технически степень защиты на всех уровнях одинаковая.
Самый простой сертификат - уровня DV - стоит в пределах 2000 руб. на год (январь 2023 г.). Такой сертификат обычно действует и на домен с www, помимо корневого. (Например, GlobalSign AlphaSSL на firstssl.ru - 1872 1250 руб., октябрь 2024.)
Срок действия сертификата не включает день "до". Например, если срок - до 2023-01-13, то сертификат действителен до 12-го числа включительно. В других случаях (GlobalSign) он действует 13 месяцев и 1 день.
Процедура получения сертификата следующая:
-
Заводим учетную запись в центре сертификации.
-
Заполняем данные сайта. Домен указываем без www.
-
Получаем приватный ключ - текст вида
-----BEGIN PRIVATE RSA KEY----- ...
. Сохраняем его в файл (например,private.key
). -
Заполняем контактные данные администратора сертификата. На указанный e-mail впоследствии пришлют файлы сертификата.
-
Выбираем способ проверки сертификата по хэш-файлу. Размещаем этот файл на сервере по адресу, указанному центром сертификации. Могут запросить дополнительную проверку через тег
<meta>
в HTML-коде страниц или через TXT-запись в DNS (в таком случае нужен доступ к панели управления регистратора доменного имени; обновления DNS становятся доступными для проверки центром сертификации практически сразу, несмотря на заявленное время до нескольких часов). Также может потребоваться отключить редирект с www-домена. -
В течение 10-20 минут на почту администратора должны прийти файлы
.crt
и.ca-bundle
. Из них нужно сделать файл сертификата простым объединением:
cat file.crt file.ca-bundle > certificate.crt
(Источник: https://firstssl.ru/faq/ssl-installation/ustanovka-ssl-na-nginx)
Набор файлов сертификата может быть немного другим. Например, в сертификате от Global Signfile.crt
из примера - этоwww_sitename_ru.crt
, а файлfile.ca-bundle
получается объединением файловAlphaSSL CA - SHA256 - G4.crt
иGlobalSign Root CA.crt
. То есть, для полученияcertificate.crt
нужно просто объединить эти три файла в указанном порядке.
Для обновления уже выданного сертификата нужно купить у центра сертификации продление, заново пройти проверку домена (п.5), а затем сделать новый файл certificate.crt
(часть п. 6) и дать команду sudo nginx -s reload
. Файл private.key
, выдаваемый центром сертификации, не меняется, за исключением, может быть, символов перевода строки - /n
или /r/n
, что на работе сертификата никак не сказывается.) При этом нужно использовать файл GlobalSign Root CA.crt
из самого первого пакета. А файл GlobalSign.crt
из последующих пакетов (без "Root"), напротив, оказывается не нужен.
Нужно убедиться, что сертификат установлен успешно, просмотрев информацию о нём через браузер (например, в Firefox: Ctrl+I
, вкладка "Защита" -> кнопка "Просмотреть сертификат"). Обратить внимание в первую очередь на срок действия сертификата.
Нужны права для редактирования и применения конфигурации nginx:
sudo vi /etc/nginx/sites-enabled/сайт
sudo nginx -s reload
Нужно скопировать на сервер два файла - приватный ключ и сам сертификат.
В блок server
конфигурации нужно добавить три директивы:
server {
listen 443 ssl;
ssl_certificate certificate.crt;
ssl_certificate_key private.key;
...
}
(Есть и другие директивы, регулирующие работу SSL, но их указание необязательно.)
Пути к файлам нужно указывать в явном виде, без переменных.
Рекомендуется также включить работу по протоколу HTTP/2: listen 443 ssl http2
.
Вот так выглядит полная конфигурация с поддержкой редиректов:
server {
server_name ~^(?<www>www\.)?(?<top_domain>сайт\.ru)$;
# http://nginx.org/en/docs/http/server_names.html#regex_names
listen 80;
listen 443 ssl http2;
ssl_certificate certificate.crt;
ssl_certificate_key private.key;
set $redirect 0;
if ($www) {
set $redirect 1;
}
if ($scheme = "http") {
set $redirect 1;
}
if ($redirect) {
return 301 https://$top_domain$request_uri;
}
# дальше пошла обычная конфигурация:
# root ...;
# ...
}
В if
nginx нет оператора OR
. Также нельзя использовать переменные в путях к подключаемым файлам, поэтому конфигурация получается длиннее, чем можно было бы ожидать.
Для каждого конкретного случая нужно исправить:
- доменное имя в директиве
server_name
- пути и имена файлов в директивах
ssl_certificate
иssl_certificate_key
После применения конфигурации следует проверить правильность работы сайта. Браузеры кэшируют ответ, поэтому их использовать для этой цели не рекомендуется. Лучше использовать для этого команду curl
:
curl -I -L -X GET https://www.сайт.ru
-I
(--head
в длинной форме) - вывести только заголовки ответа-X GET
- использовать метод запросаGET
(при наличии-I
по умолчанию используетсяHEAD
)-L
- проследовать по цепочке редиректов
curl -I -L -X GET http://www.vysokie.ru -s | grep -P "HTTP|Location"
отфильтрует ответ,
оставив только значимые для редиректа строки (-s
убирает индикатор выполнения, -P
у
grep
включает режим Perl-совместимых регулярных выражений, который требуется для работы альтернатив - |
).