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

в 15:41, , рубрики: devops, LetsEncrypt, nginx, ssl certificate, системное администрирование

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

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

Мы же будем использовать manual режим бота 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 или Zero SSL). Далее необходимо скопировать эти файлы в директорию /var/www/ssl-proof/myserv/.well-known. Если вы используете Docker, то вам придется или подключить эту директорию к контейнеру или пересобрать образ.

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

Настройка 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

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js