/ ubuntu

Letsencrypt и nginx на Ubuntu 14.04

Хочу рассказать как настроить Letsencrypt на Ubuntu 14.04 совместно с nginx и сделать автопродление сертификатов.

Начнем с того что нужно поставить git

apt-get -y install git

Далее скачиваем сам letsencrypt:

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Теперь нужно проверить что 80 порт доступен для этого нужно отключить nginx

service nginx stop

Ну и убедимся что все свободно и ничего нам не мешает:

service nginx stop

Теперь преступим к выпуску сертификата, мы будем использовать Standalone плагин для этого:

cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone

Нам нужно будем ввести домен к которому мы выпустим сертификат (если нужно выпустить сертификаты к нескольким доменам для разделения нужно использовать "пробел")
ввод домена
После этого действия у нас появится наш первый сертификат, по умолчанию все сертификаты хранятся в директории /etc/letsencrypt/live/имя_домен.

Теперь заставим все это работать с nginx. Для начала настроим переадресацию на https

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
И конфигурация для 443 порта:
server {
    listen 443;
    server_name example.com www.example.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
}

Теперь все работает, но как вы можете видеть срок жизни нашего сертификата всего месяц и очень не хочется каждый раз проделывать данные действия в ручную. Поэтому сейчас я опишу как настроить автопродление сертификатов.

Для этого мы будем использовать Webroot плагин. Он создает скрытую директорию /.well-known в корне вашего сайта используемую для валидации самим letsencrypt. Я предлагаю вынести эту директорию из корня всех сайтов, и расположить в /var/www/. Для этого нужно добавить в конф. файл nginx такой блок:

location /.well-known/ {
    alias /var/www/.well-known/;
    allow all;
}

Теперь проверим все ли корректно работает:

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www -d example.com -d www.example.com

И мы должны получить сообщение

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire
   on 2016-05-29. To obtain a new version of the certificate in the
   future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Теперь давайте приступим к автоматизации данного действия. Для начала нужно создать конфигурационый файл, мы скопируем его и примеров в самом letsencrypt

cp /opt/letsencrypt/examples/cli.ini /usr/local/etc/le-renew-webroot.ini

И отредактируем так как нам нужно

vi /usr/local/etc/le-renew-webroot.ini

На выходе мы должны получить такой конфиг:

rsa-key-size = 4096

email = you@example.com

domains = example.com, www.example.com

webroot-path = /var/www

Теперь проверим наш конфигурационный файл:

cd /opt/letsencrypt
./letsencrypt-auto certonly -a webroot --renew-by-default --config /usr/local/etc/le-renew-webroot.ini

Теперь создадим скрипт для автоматического выполнения продления если нашему сертификату осталось жить меньше 30 дней. К своему счастью я нашел готовое решение gist.github.com/thisismitch.
Здесь делаем все просто

curl -L -o /usr/local/sbin/le-renew-webroot https://gist.githubusercontent.com/thisismitch/e1b603165523df66d5cc/raw/fbffbf358e96110d5566f13677d9bd5f4f65794c/le-renew-webroot
chmod +x /usr/local/sbin/le-renew-webroot

Проверяем наш скрипт:

le-renew-webroot

И добавляем его в crontab

crontab -e
30 2 * * 1 /usr/local/sbin/le-renew-webroot >> /var/log/le-renewal.log

Лог всех действий будет доступен в /var/log/le-renewal.log

Вот собственно и все. Также в процессе написания нашел на просторах более полную и подробно расписанную инструкцию на английском собственно часть со скриптом обновления и утащил из нее