- PVSM.RU - https://www.pvsm.ru -

Получение Let’s Encrypt сертификата с минимальными трудозатратами

В этом руководстве я бы хотел показать, как сгенерировать LetsEncrypt SSL сертификат для тестового сайта с минимальными трудозатратами. Я буду использовать Nginx в режиме reverse proxy в качестве web сервера.

Этот текст рассчитан для новичков в настройке Nginx и описанный способ настройки не подойдет для использования в production. Я решил написать это руководство потому что мне понадобилось быстро развернуть сайт с SSL, но я не нашел простого способа сделать это. В сети доступны [1] Docker образы, которые позволяют добавить в инфраструктуру слой, отвечающий за обновление сертификатов, но эти решения требуют настройки.

Мы же будем использовать manual [2] режим бота LetsEncrypt или сторонний сервис, который выполнит команду (в случае, если вы не дружите с консолью). Использование стороннего сервиса потенциально небезопасно, так как сервис может сохранить ваш приватный ключ у себя.

Получение ключа

В качестве отправной точки предположим у нас имеется сервис myserv.com на который Nginx перенаправляет HTTP запросы.

Конфигурация myserv.com :

upstream myserv{
    server myserv:80;
}

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

    index index.html index.htm index.nginx-debian.html;
    server_name myserv.com;

    location / {
        proxy_pass              http://myserv;
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection keep-alive;
        proxy_set_header        Host $host;
        proxy_cache_bypass      $http_upgrade;
        proxy_redirect          off;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        client_max_body_size    64m;
        proxy_connect_timeout   90;
        proxy_send_timeout      90;
        proxy_read_timeout      90;
    }
}

Для того чтобы ответить на запрос LetsEncrypt и подтвердить владение доменом мы должны отдать файл в поддиректории /.well-known.
Для этого добавим следующий код в конфигурацию сервиса:

Конфигурация myserv.com с поддиректорий .well-known:

upstream myserv{
    server myserv:80;
}

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

    index index.html index.htm index.nginx-debian.html;
    server_name myserv.com;

    location /.well-known {
        root /var/www/ssl-proof/myserv/;
    }

    location / {
        proxy_pass              http://myserv;
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection keep-alive;
        proxy_set_header        Host $host;
        proxy_cache_bypass      $http_upgrade;
        proxy_redirect          off;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        client_max_body_size    64m;
        proxy_connect_timeout   90;
        proxy_send_timeout      90;
        proxy_read_timeout      90;
    }
}

Мы можем получить файлы валидации при помощи команды

sudo certbot certonly --manual --preferred-challenges http -d myserv.com

или инициализации процесса проверки домена на стороннем сервисе (например, SSL For Free [3] или Zero SSL [4]). Далее необходимо скопировать эти файлы в директорию /var/www/ssl-proof/myserv/.well-known. Если вы используете Docker, то вам придется или подключить эту директорию к контейнеру или пересобрать образ.

Теперь вы можете валидировать домен и получите файл сертификата, приватный ключ (если не указывали свой) и файл цепочки подписей (trust chain [5]).

Настройка SSL

Для работы Nginx достаточно сертификата и приватного ключа. Большинство браузеров сами проверяют промежуточные сертификаты. Если же вы хотите обращаться к своему сервису с помощью веб клиента, то вам придется создать файл сертификата, который включает в себя информацию о промежуточных CA.
Вам нужно склеить файл сертификата с файлом промежуточных сертификатов:

cat myserv.crt bundle.myserv.crt >> chained.myserv.crt

Порядок важен, так как ключ будет применяться к первому сертификату. Если в конце первого сертификата отсутствует перевод строки — добавьте его.

Теперь мы можем обновить конфигурацию нашего сервиса:

Конфигурация myserv.com с поддержкой SSL:

upstream myserv{
    server myserv:80;
}

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

    server_name myserv.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443;

    index index.html index.htm index.nginx-debian.html;
    server_name myserv.com;

    ssl_certificate     /etc/letsencrypt/live/myserv/chained.myserv.crt;
    ssl_certificate_key /etc/letsencrypt/live/myserv/myserv.key;

    location /.well-known {
        root /var/www/ssl-proof/myserv/;
    }

    location / {
        proxy_pass              http://myserv;
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection keep-alive;
        proxy_set_header        Host $host;
        proxy_cache_bypass      $http_upgrade;
        proxy_redirect          off;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        client_max_body_size    64m;
        proxy_connect_timeout   90;
        proxy_send_timeout      90;
        proxy_read_timeout      90;
    }
}

Вы можете проверить наличие промежуточных сертификатов послав запрос к вашему сайту утилитой curl. Если промежуточные сертификаты не доступны, вы получите предупреждение.

Если ваши сервисы не используют директорию /.well-known, то можно не останавливаться на достигнутом и настроить автоматическое продление сертификатов. В моем случае /.well-known использовалась IdentityServer4 и мне пришлось отключить отдачу файлов валидации домена.

Я надеюсь, что эта статья поможет вам попробовать LetsEncrypt и начать использовать их сертификаты вместо self-signed сертификатов.

Автор: Michael_SL

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/nginx/266737

Ссылки в тексте:

[1] доступны: https://hub.docker.com/r/jrcs/letsencrypt-nginx-proxy-companion/

[2] manual: https://certbot.eff.org/docs/using.html#manual

[3] SSL For Free: https://www.sslforfree.com/

[4] Zero SSL: https://zerossl.com/

[5] trust chain: https://letsencrypt.org/certificates/

[6] Источник: https://habrahabr.ru/post/341040/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox