Skip to content

Instantly share code, notes, and snippets.

@1234ru
Last active January 12, 2023 10:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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 руб.)

Срок действия сертификата не включает день "до". Например, если срок - до 2023-01-13, то сертификат действителен до 12-го числа включительно.

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

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

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

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

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

  5. Выбираем способ проверки сертификата по хэш-файлу. Размещаем этот файл на сервере по адресу, указанному центром сертификации. Могут запросить дополнительную проверку через тег <meta>в HTML-коде страниц. Также может потребоваться отключить редирект с 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 нужно просто объединить эти три файла в указанном порядке.

Если для сайта уже был установлен сертификат, можно просто заменить файлы certificate.crt и private.key и дать команду sudo nginx -s reload.

Нужно убедиться, что сертификат установлен успешно, просмотрев информацию о нём через браузер (например, в 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