- PVSM.RU - https://www.pvsm.ru -
В этом руководстве я бы хотел показать, как сгенерировать LetsEncrypt SSL сертификат для тестового сайта с минимальными трудозатратами. Я буду использовать Nginx в режиме reverse proxy в качестве web сервера.
Этот текст рассчитан для новичков в настройке Nginx и описанный способ настройки не подойдет для использования в production. Я решил написать это руководство потому что мне понадобилось быстро развернуть сайт с SSL, но я не нашел простого способа сделать это. В сети доступны [1] Docker образы, которые позволяют добавить в инфраструктуру слой, отвечающий за обновление сертификатов, но эти решения требуют настройки.
Мы же будем использовать manual [2] режим бота LetsEncrypt или сторонний сервис, который выполнит команду (в случае, если вы не дружите с консолью). Использование стороннего сервиса потенциально небезопасно, так как сервис может сохранить ваш приватный ключ у себя.
В качестве отправной точки предположим у нас имеется сервис myserv.com
на который Nginx перенаправляет HTTP запросы.
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
.
Для этого добавим следующий код в конфигурацию сервиса:
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]).
Для работы Nginx достаточно сертификата и приватного ключа. Большинство браузеров сами проверяют промежуточные сертификаты. Если же вы хотите обращаться к своему сервису с помощью веб клиента, то вам придется создать файл сертификата, который включает в себя информацию о промежуточных CA.
Вам нужно склеить файл сертификата с файлом промежуточных сертификатов:
cat myserv.crt bundle.myserv.crt >> chained.myserv.crt
Порядок важен, так как ключ будет применяться к первому сертификату. Если в конце первого сертификата отсутствует перевод строки — добавьте его.
Теперь мы можем обновить конфигурацию нашего сервиса:
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
Нажмите здесь для печати.