Читал я и ужасался: одни пишут, что то нужно nginx или apache остановить («на пару минуточек всего»), другие предлагают файлы подкладывать в папку веб-сервера (в соседней ssh-сессии), третьи — о том, как важно соблюсти правильный Content-type для файлов проверки домена…
Давайте попробуем обойтись без всего этого: чтобы не было мучительно больно ни на стадии установки, ни очередном продлении — даже если придётся обновлять сразу много доменов. Собственно, вот и вся цель моей небольшой заметки: это не пошаговый степ-бай-степ, не длинная теоретическая статья о том, как функционирует Let's Encrypt — просто описывается правильный на мой взгляд подход, который будет правилен для конфигурации любой сложности.
Вся суть в двух словах: пусть Let's Encrypt запустит веб-сервер на 9999 порту, а мы допишем конфиг nginx, чтобы он пробросил запрос на этот бекенд. Кому интересны детали — прошу под кат
Установка Let's Encrypt в настоящее время рекомендуется из репозитория на гитхабе:
git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt
Для некоторых операционок уже есть готовые пакеты (более того — вместо команды letsencrypt-auto (которая по сути есть лишь обёртка для letsencrypt) можно использовать letsencrypt), но установка из репозитория меня, как программиста вполне устраивает.
Далее — нужно подготовить наш сервер.
В принципе, всё, что от нас требуется — это чтобы по адресу mysubdomain.mydomain.tld/.well-known/acme-challenge/6il4rb2ErDWuBnUsTw_qrJc_tXGNv43p2a4kQQc0CvE отдавался заранее определённый контент с нужными заголовками.
Переложим эту работу на сам Let's Encrypt: пусть сам подымет на 127.0.0.1:9999 собственный веб-сервер, а мы — лишь допишем в конфиг nginx правило для проброса запросов на этот бекенд. Не нужно ни останавливать ничего, ни тем более создавать файлы вручную.
Итак. Создаём файл /etc/nginx/template/letsencrypt.conf следующего вида:
location ~ ^/(.well-known/acme-challenge/.*)$ {
proxy_pass http://127.0.0.1:9999/$1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
И подключим в конфиг-файлы нужных поддоменов:
include template/letsencrypt.conf;
Собственно, это всё. Дальше можно запустить одну-единственную команду — собственно запустить Let's encrypt:
letsencrypt-auto --agree-tos --renew-by-default --standalone --standalone-supported-challenges http-01 --http-01-port 9999 --server https://acme-v01.api.letsencrypt.org/directory certonly -d mydomain.tld -d www.mydomain.tld -d i1.mydomain.tld -d i2.mydomain.tld
Здесь я получаю сертификат сразу для четырёх поддоменов, указываю, что нужно запустить веб-сервер на порту 9999, согласиться с лицензионным соглашением. (В принципе, можно указать в командной строке е-мейл, чтобы вообще не пришлось в интерактивный режим входить и довносить эту информацию: читайте описание ключей в документации)
В принципе, больше описывать нечего. Как внести сертификат в конфиг-файл nginx достаточно хороших и правильных описаний.
Единственное — осталось добавить в cron команду автоматического продления:
letsencrypt renew >> /dev/null 2>&1
В getting-started приведены другие примеры скриптов обновления, рекомендую посмотреть: можно предусмотреть допустим отправку письма в случае, если обновление закончилось неудачей или автоматически рестартовать демон веб-сервера.
Вот и всё. От себя добавлю, что очень не люблю быть в первых рядах новой технологии («пока не выйдет первый сервис-пак — нет смысла обновлять винду на новую»), но в принципе, вижу, что Let's Encrypt уже можно потихоньку начинать использовать в продакшн.
PS В качестве основы для своей заметки я взял статью Дмитрия из его блога. Не знаю, есть ли он на хабре, в любом случае от меня — большое спасибо.
Комментарии (14)
jehy
21.03.2016 09:57-9Только упустили, что получать надо сертификат не у let's encrypt, а у wosign. Провайдер один и тот же, зато на два года, а не на год.
rshadow
21.03.2016 12:00+3Вы предлагаете заменить открытое, автоматизированное, правильное решение на проприетарщину без плюсов, а только с минусами? Интересный подход. Наверно те кто привык к такой «халяве» еще долго будут ломать копья и бегать за скидками =(
jehy
21.03.2016 12:08-4Ну если вы готовы нести в продакшн автоматизированное обновление сертификатов, которое находится в бета версии, и рисковать раз в два месяца — флаг вам в руки.
И считать let's encrypt более открытым, чем его создателей — это просто смешно. Вы так можете считать любое решение на основе API с github открытым. Или вы считаете, что кусок кода с гитхаба вам позволяет как-то отвязаться от центра сертификации?jehy
21.03.2016 12:56-4Отдельный привет минусующим, которые видимо не знают, как работают SSL сертификаты и их получение. Жалко, конечно, что такой уровень аудитории.
rshadow
21.03.2016 16:48+2> которое находится в бета версии,
Сегодня в бете, завтра нет. На некритичных ресурсах попробовал. Полгода — полет нормальный.
> И считать let's encrypt более открытым, чем его создателей
Это вы уже сами что-то выдумали. Я вижу открытый клиент. Я вижу людей, которые делают опенсорс и их стремление в правильном направлении. Я прекрасно понимаю что private key нельзя выкладывать в опенсорс ;) Что еще надо?
А вы предлагаете в качестве альтернативы закоренелых продавцов ?в?о?з?д?у?х?а? записей в БД. Снизошедших до простых смертных.
Aiditz
Но можно еще проще. Не нужно поднимать сервер на 9999 порту, достаточно указать letsencrypt'у, в какой папке будет лежать файл. Конфиг nginx:
location /.well-known/acme-challenge {
root /var/www/letsencrypt/;
}
Генерация сертфиката:
./letsencrypt-auto certonly --webroot -w /var/www/letsencrypt -d domain.com
questor
Тоже неплохой вариант. Вообще, под nginx есть уже и плагин, только на сайте он числится как глубоко экспериментальный. Думаю, что через год запрос сертификата будет действительно намного проще чем сейчас.
MrJeos
Так можно делать даже без правки конфига, если указать папку самого сайта, а не отдельную для letsencrypt.
Aiditz
Не всегда у сайта есть public-директория.
Другой минус: нужно для каждого сайта помнить и указывать путь к public-папке.
А добавить include letsencrypt.conf — универсальный вариант, работающий при любой конфигурации.
MrJeos
Этот include надо ведь прописать в каждой секции server, верно?
Aiditz
Я прописывал в каждой, но может быть можно как-то от этого уйти — я не разбирался, т.к. у меня доменов немного.
inkvizitor68sl
Так sudo понадобится, как раз.