Наличие SSL сертификата на сайте никого не удивляет. Скорее удивит отсутствие «безопасного соединения» на сайте. Если вы ничего не знаете о SSL, сначала читаем статью HTTPS и SSL для SEO. После этого возвращаемся к даной инструкции. Это пошаговое руководство, как настроить Let’s Encrypt для Nginx на Ubuntu 18.04 с разными ништяками.

Виртуальные хосты

Предположим, вы хотите разместить домены first.com и second.com на сервере. Создавайте папки для своих файлов:

mkdir /var/www/first
mkdir /var/www/second

Создаем файл конфигурации /etc/nginx/sites-available/first.conf с текстом:

server {
	listen 80 default_server;
	listen [::]:80 default_server ipv6only=on;

	server_name first.com www.first.com;
	root /var/www/first;

	index index.html;
	location / {
		try_files $uri $uri/ =404;
	}
}

Аналогично создаем файл для второго домена:

server {
	listen 80;
	listen [::]:80;

	server_name second.com www.second.com;
	root /var/www/second;

	index index.html;
	location / {
		try_files $uri $uri/ =404;
	}
}

Обратите внимание, что только первый домен имеет ключевые слова default_server и ipv6only = on в строке listen.

Убираем дефолтные настройки nginx:

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/first.conf /etc/nginx/sites-enabled/first.conf
sudo ln -s /etc/nginx/sites-available/second.conf /etc/nginx/sites-enabled/second.conf

sudo nginx -t #проверяет конфигурацию NGINX на наоичие ошибок
sudo systemctl stop nginx #останавливает сервис NGINX
sudo systemctl start nginx #запускает NGINX с новыми настройками

Если нет ошибок и дополнительных уведомлений, значит все прошло хорошо. На всякий случай, проверить статус Nginx можно командой:

sudo systemctl status nginx

В ответ мы должны увидеть что-то похожее:

проверияем статус Nginx на сервере

В результате настройки виртуальных хостов, мы получили:

  • http://first.com и http://www.first.com загружаются с папки /var/www/first
  • http://second.com и http://www.second.comзагружаются с папки /var/www/second
  • https://www.first.com и https://www.second.com еще не работают

Устанавливаем Certbot на NGINX

certbot

Certbot — это официальный клиент для Let’s Encrypt, который позволяет запрашивать SSL сертификаты с помощью командной строки. Официальную документацию можно почитать на сайте: https://certbot.eff.org/docs/.

Установка Certbot в Ubuntu:

sudo apt-get update
sudo add-apt-repository ppa:certbot/certbot #добавляем репозиторий
sudo apt-get update
sudo apt-get install -y python-certbot-nginx #устанавливаем Certbot

Далее устанавливаем сертификаты и конвертируем виртуальные хосты в HTTPS:

sudo certbot --nginx
В интерфейсе командной строки нас попросят:
  • ввести адрес электронной почты,
  • подтвердить согласие с Условиями обслуживания,
  • указать домены  для использования HTTPS (он определяет список, используя строки server_name в вашей конфигурации Nginx),
  • перенаправить HTTP на HTTPS (рекомендуется).

Здесь настройку можно прекратить, так как мы уже получили SSL сертификаты с рейтингом A. Проверить свой сайт с помощью SSL Labs, можно по ссылке https://www.ssllabs.com/ssltest/analyze.html?d=ДОМЕН.

В результате, мы получаем:

  • http://first.com редиректит на https://first.com
  • http://second.com редиректит на https://second.com
  • http://www.first.com редиректит на https://www.first.com
  • http://www.second.com редиректит на https://www.second.com
  • https://first.com и https://www.first.com загружаются с папки from /var/www/first
  • https://second.com и https://www.first.com загружаются с папки /var/www/second

Автоматическое обновление сертификатов Let’s Encrypt

При правильной установке на предыдущем этапе, для автоматического обновления ничего делать не нужно. Certbot добавил задачу cron для автоматического продления срока действия сертификатов. Проверить это можно командами:

sudo certbot renew --dry-run #проверка продления сертификатов
sudo certbot certificates #проверка существующих сертификатов

Настройка HTTP/2 на NGINX

Особеностиью установки Certbot, в нашем случае, является автоматическое редактирование конфигов. Конфиг first.conf теперь должен выглядеть примерно так:

server {
	server_name first.com www.first.com;
	root /var/www/first.com;

	index index.html;
	location / {
		try_files $uri $uri/ =404;
	}

	listen [::]:443 ssl ipv6only=on; # managed by Certbot
	listen 443 ssl; # managed by Certbot
	ssl_certificate /etc/letsencrypt/live/first.com/fullchain.pem; # managed by Certbot
	ssl_certificate_key /etc/letsencrypt/live/first.com/privkey.pem; # managed by Certbot
	include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
	if ($host = www.first.com) {
		return 301 https://$host$request_uri;
	} # managed by Certbot

	if ($host = first.com) {
		return 301 https://$host$request_uri;
	} # managed by Certbot

	listen 80 default_server;
	listen [::]:80 default_server;

	server_name first.com www.first.com;
	return 404; # managed by Certbot
}

Certbot не добавлял поддержку HTTP / 2, когда он создавал новые серверные блоки, поэтому замените эти строки:

listen [::]:443 ssl ipv6only=on;
listen 443 ssl;

на эти:

listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
gzip off;

Рейтинг А+ для SSL сертификатов

В NGINX конфигах наших сайтов содержатся следующие строки:

ssl_certificate /etc/letsencrypt/live/YOUR-DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR-DOMAIN/privkey.pem;

Более сильные настройки используют OCSP Stapling (сшивание OCSP), поэтому каждому виртуальному хосту будет нужен ssl_trusted_certificate.

Добавьте эту строку (используя имя папки, которую Certbot создал для вашего домена) после строки ssl_certificate_key:

ssl_trusted_certificate /etc/letsencrypt/live/YOUR-DOMAIN/chain.pem;

Теперь давайте отредактируем общие настройки SSL в /etc/letsencrypt/options-ssl-nginx.conf. Скорее всего, они выглядит так:

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

Заменяем содержимое файла на:

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1d;
ssl_session_tickets off;

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;

ssl_stapling on;
ssl_stapling_verify on;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload;";
add_header Content-Security-Policy "default-src 'none'; frame-ancestors 'none'; script-src 'self'; img-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self';";
add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

Теперь перезапустите Nginx и снова проверяем домен с помощью SSL Labs. Должен получиться рейтинг А+. О том, почему я больше люблю Nginx, а не Apache, читаем тут: NGINX или Apache?

Как настроить Let’s Encrypt для Nginx на Ubuntu 18.04 (с IPv6, HTTP/2 и A+ SSL рейтингом)
5 / Оценили: 3