Настройка безопасного использования letsencrypt nginx dokcer
Сейчас мало кто не знает о кампании letsencrypt, и бесплатных сертификатах. Меня по началу смутило что необходимо запустить скрипт от рута, который крайне дружелюбно влезет в конфиг веб сервера и после проверки вставит сертфикат куда посчитает нужным. Кроме того для проверки домена ему потребуется доступ к рутовой директории с файлами сайта. Однако при первом занкомстве оказалось что все не так страшно и выход из положения долго искать не нужно. Скрипт можно запускать от не привелигированного пользователя, а конфиг веб сервера вообще не нужно трогать лапками letsencrypt. Кроме того если тревога осталась — можно запускать скрипт внутри изолированного контейнера, но это имхо уже лишнее.
Покажу на примере docker контейнера с стандартным сайтом на 80м порту. Нам нужно создать папку в которую letsencrypt положит файл проверки, прокинуть ее в контейнер с внешним балансером nginx. Создать пользователя от которого будет работать скрипт letsencrypt и поменять права на соответствующие папки.
Поехали. От рута:
1 2 3 4 |
mkdir -p /srv/docker/letsencrypt/casp.ru yum install letsencrypt useradd -m -s /bin/bash letsencrypt chown -R letsencrypt /var/log/letsencrypt/ /etc/letsencrypt/ /srv/docker/letsencrypt/ |
Если в вашем дистрибутиве нету такого — то клонируем репу и продолжаем работать локально
1 |
git clone https://github.com/letsencrypt/letsencrypt |
Меняем конфиг docker-compose для nginx, добавляем volumes:
1 2 3 |
volumes: - /etc/letsencrypt/:/etc/letsencrypt/:ro - /srv/docker/letsencrypt:/var/www/letsencrypt:ro |
После добавляем в nginx location:
1 |
location ~ ^/\.well-known { root /var/www/letsencrypt/; } |
Будте внимательны, если у Вас на 80м порту нет ничего кроме редиректа на https следите чтобы location / существовал.
И от пользователя:
1 |
sudo -u letsencrypt letsencrypt certonly --webroot -w /srv/docker/letsencrypt/ -d casp.ru |
Если все сделали правильно — увидите сообщение об успехе. Добавляем поддержку https в наш домен:
1 2 3 4 5 |
listen 443 ssl; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate_key /etc/letsencrypt/live/casp.ru/privkey.pem; ssl_certificate /etc/letsencrypt/live/casp.ru/fullchain.pem; |
Релоадим nginx и наслаждаемя зеленым цветом сертификата выданного на 3 месяца.
Ставим в cron задачу по апдейту сертификатов раз в месяц.
1 |
0 0 * * 1 letsencrypt renew && docker exec -it nginx_in nginx -s reload |
Или при работе с git клоном
1 |
0 0 * * 1 cd /root/letsencrypt && ./letsencrypt-auto renew && nginx -t && nginx -s reload |
На этом все. Оглядываемся на 15 минут назад, понимаем насколько удобный продукт сделали letsencrypt. Посылаем им лючи добра, а о новом тренде рассказываем друзьям и знакомым :)