Dmitriy Azarov

Настройка SSL Let's Encrypt в Nginx на Ubuntu

Настройка SSL Let's Encrypt в Nginx на Ubuntu

Файлы импорта

Создами несколько файлов для уменьшия копипасты. Первый файл нужен для проверки letencrypt домена. Создаем файл /etc/nginx/snippets/letsencrypt.conf содержимым

location ^~ /.well-known/acme-challenge/ {
	default_type "text/plain";
	root /var/www/letsencrypt;
}

И файл общих настроек для ssl /etc/nginx/snippets/ssl.conf

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

Создаем директорию, необходимую для работы letsencrypt

sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge

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

Так как в самом начале нет сертификата, получать его будем по протоколу http. В уже существующем сайте (или новом) имеем:

server {
	listen 80;
	listen [::]:80 ipv6only=on;
	server_name oxozle.com;

	include /etc/nginx/snippets/letsencrypt.conf;
}

Включаем сайт

ln -s /etc/nginx/sites-available/oxozle.com /etc/nginx/sites-enabled/oxozle.com

И рестартуем nginx

sudo systemctl reload nginx

Certbot

Утилита, для запроса и обновления сертификатов из командной строки.

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

Запрашиваем сертификат через certbot

certbot certonly --webroot --agree-tos --no-eff-email --email mail@example.com -w /var/www/letsencrypt -d oxozle.com

HTTPS

Включаем редирект на http и включаем сам https

server {
        listen 80;
        listen [::]:80 ipv6only=on;
        server_name oxozle.com;

        include /etc/nginx/snippets/letsencrypt.conf;

        return 301 https://$host$request_uri;
}


server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2 ipv6only=on;
        server_name oxozle.com;

        ssl_certificate /etc/letsencrypt/live/oxozle.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/oxozle.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/oxozle.com/fullchain.pem;
        include /etc/nginx/snippets/ssl.conf;
}

И рестартуем nginx

sudo systemctl reload nginx

Автоматическое обновление

Сертификат действует 30 дней, мы будем обновлять его чрез cron.

Включаем:

certbot renew --dry-run

Создаем файл ~/letsencrypt.sh, который будет исполнятся время от времени

#!/bin/bash
systemctl reload nginx

Делаем его исполняемым

chmod +x ~/letsencrypt.sh

Входим в редактирование cron

sudo crontab -e

Добавляем строку

20 3 * * * certbot renew --noninteractive --renew-hook ~/letsencrypt.sh
  • 21 янв. 2018
  • ssl, nginx
0 комментариев
Ваш комментарий
адрес не будет опубликован
Текст