Настройка https для nginx с использованием letsencrypt

В качестве системы используем ubuntu 16.04 с уже установленным nginx

Подготовка nginx

Для начала необходимо подготовить nginx к использованию letsencrypt.
Если nginx используется только для раздачи статики, то пока что ничего редактировать не надо.
Если же nginx используется, как проксирующий сервер, то нужно настроить его для раздачи файлов подтверждения letsencrypt.

sudo nano /etc/nginx/sites-available/blog.nstsyrlin.ru

Добавим дополнительный блок location:

 location /.well-known {
     root /директория/для/хранения/файлов/подтверждения;
 }

Теперь nginx готов к использованию с letsencrypt.

Получение сертификата letsencrypt
sudo apt-get install letsencrypt
sudo letsencrypt certonly --webroot -w /директория/для/хранения/файлов/подтверждения -d example.com -d www.example.com -w /другая/директория/для/хранения/файлов/подтверждения -d thing.is -d m.thing.is

Таким образом мы получим сертификаты для доменов example.com и www.example.com, используя одну директорию, а для доменов thing.is и m.thing.is, используя другую.

Если всё прошло успешно, то letsencrypt скажет, куда сохранил сертификат.

Настройка nginx для использования https

Снова отредактируем \etc\nginx\sites-available\blog.nstsyrlin.ru:

server {
    server_name blog.nstsyrlin.ru;
    listen 80;
    return 301 https://blog.nstsyrlin.ru$request_uri;
}

server {
    listen 443 ssl http2;
    server_name blog.nstsyrlin.ru;
    resolver 127.0.0.1;
    ssl_stapling on;
    ssl_trusted_certificate /etc/letsencrypt/live/blog.nstsyrlin.ru/chain.pem
    ssl on;
    ssl_certificate /etc/letsencrypt/live/blog.nstsyrlin.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.nstsyrlin.ru/privkey.pem;
    ssl_dhparam /etc/pki/nginx/dhparam.pem;
    ssl_session_timeout 24h;
    ssl_session_cache shared:SSL:2m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000;";
    add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report";
    location /.well-known {
        root /директория/для/хранения/файлов/подтверждения;
    }
    # остальные location блоки из старого конфига
}

Осталось сгенерировать dhparam.pem:

openssl dhparam -out /etc/pki/nginx/dhparam.pem 4096

Если вы используется nginx в качестве прокси, то стоит добавить эту строчку в ваш блок location:

proxy_set_header X-Forwarded-Proto https;

Это позволит избежать бесконечного редиректа, который возникает в некоторых случаях.

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

Сертификаты letsencrypt имеют срок 3 месяца, поэтом целесообразно настроить их автоматическое обновления.

Для начала проверим все настройки:

sudo letsencrypt renew --dry-run --agree-tos

Если всё успешно, то пропишем обновление в cron

sudo crontab -e

Допишем в конец:

7 11 * * * letsencrypt renew

Таким образом, каждый день в 11 утра будет проверяться необходимость обновления сертификатов.