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