Skip to content

Instantly share code, notes, and snippets.

@1234ru
Last active October 18, 2024 22:28
Show Gist options
  • Save 1234ru/c3215cef65747687b0df9680b380863d to your computer and use it in GitHub Desktop.
Save 1234ru/c3215cef65747687b0df9680b380863d to your computer and use it in GitHub Desktop.
Настройка работы сайта по протоколу HTTPS, получение и установка SSL-сертификата

Получение сертификата

Есть множество центров сертификации, которые ищутся по запросу "купить ssl сертификат".

Существует три уровня сертификатов, которые отличаются скрупулезностью проверки запросившей сертификат организации и, соответственно, стоимостью (в несколько раз). При этом технически степень защиты на всех уровнях одинаковая.

Самый простой сертификат - уровня DV - стоит в пределах 2000 руб. на год (январь 2023 г.). Такой сертификат обычно действует и на домен с www, помимо корневого. (Например, GlobalSign AlphaSSL на firstssl.ru - 1872 1250 руб., октябрь 2024.)

Срок действия сертификата не включает день "до". Например, если срок - до 2023-01-13, то сертификат действителен до 12-го числа включительно. В других случаях (GlobalSign) он действует 13 месяцев и 1 день.

Процедура получения сертификата следующая:

  1. Заводим учетную запись в центре сертификации.

  2. Заполняем данные сайта. Домен указываем без www.

  3. Получаем приватный ключ - текст вида -----BEGIN PRIVATE RSA KEY----- .... Сохраняем его в файл (например, private.key).

  4. Заполняем контактные данные администратора сертификата. На указанный e-mail впоследствии пришлют файлы сертификата.

  5. Выбираем способ проверки сертификата по хэш-файлу. Размещаем этот файл на сервере по адресу, указанному центром сертификации. Могут запросить дополнительную проверку через тег <meta>в HTML-коде страниц или через TXT-запись в DNS (в таком случае нужен доступ к панели управления регистратора доменного имени; обновления DNS становятся доступными для проверки центром сертификации практически сразу, несмотря на заявленное время до нескольких часов). Также может потребоваться отключить редирект с www-домена.

  6. В течение 10-20 минут на почту администратора должны прийти файлы .crt и .ca-bundle. Из них нужно сделать файл сертификата простым объединением:
    cat file.crt file.ca-bundle > certificate.crt
    (Источник: https://firstssl.ru/faq/ssl-installation/ustanovka-ssl-na-nginx)
    Набор файлов сертификата может быть немного другим. Например, в сертификате от Global Sign file.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

Нужны права для редактирования и применения конфигурации 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.

Настройка редиректов с http: и/или www.

Вот так выглядит полная конфигурация с поддержкой редиректов:

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-совместимых регулярных выражений, который требуется для работы альтернатив - |).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment