Еще недавно, чтоб получить SSL сертификат нужно было заморачиваться с StartSSL или платить деньги регистраторам. Но LetsEncrypt уже вышел из беты и хорошо себя зарекомендовал.
Я не захотел использовать официальный монструозный инструментарий, а вместо этого решил разобраться, как работает протокол и заодно написать свой велосипед, который едет веселее и не имеет фатальных недостатков.
Скажу сразу, что скрипт работает только с nginx, так что, если просто хотите сгенерировать сертификат или у вас другой веб сервер, то можете изучить скрипт только на предмет его работы с ACME.
Представляю вашему вниманию самый простой способ получения/продления сертификата:
sudo acme-nginx -d example.com -d www.example.com
Всего одна команда и у вас есть рабочий валидный сертификат сроком на 90 дней. Выполняете эту команду еще раз, и сертификат продлен! Скрипт не модифицирует ваши существующие конфигурации, так что вам все таки придется прописать в них пути к новому сертификату и ключу.
Как установить?
git clone https://github.com/kshcherban/acme-nginx
cd acme-nginx
sudo python setup.py install
Убедитесь, что на сервере, где вы запускаете работает nginx, а 80 порт доступен извне, а также, что на IP адрес этого сервера указывает доменное имя, для которого вы собираетесь регистрировать/продлевать сертификат.
Как это работает?
acme-nginx представляет собой полноценный ACME клиент, у которого всего две python зависимости: OpenSSL и Crypto.
Первым делом, acme-nginx проверяет ключи,
которые заданы в командной строке, если не заданы, то используются значения по-умолчанию (см. acme-nginx --help
).
Если ключей нет, то скрипт генерирует их сам. Всего два ключа: один, клиентский, для работы с ACME, второй, доменный, непосредственно для сертификата.
На основании доменного ключа создается CSR. Для этого используются доменные имена, заданные в командной строке, это единственный обязательный аргумент. Количество доменных имен можно задавать любое, сколько поддерживает letsencrypt. Первое будет использоваться как CN, остальные как SAN.
Потом создается конфиг хоста для nginx. Он нужен для прохождения проверки домена.
По-умолчанию это /etc/nginx/sites-enabled/letsencrypt
, но можно задать любой при помощи флага --virtual-host
Создается временная директория в /tmp
, в которую записываются файлы для проверки
домена, а созданный конфиг nginx, соответсвенно, указывает на эти файлы.
Для каждого указанного домена процедура повторяется в цикле.
Когда все проверки пройдены, создается подписанный сертификат вместе с цепочкой.
Удаляются все временные файлы, в том числе тот самый конфиг nginx,
и nginx посылается сигнал HUP.
Сертификат и ключи по-умолчанию кладутся в /etc/ssl/private
После того, как серификат получен, можно прописать его в свой конфиг nginx и еще раз зарелоадить его.
Вот такую cron задачу я сделал для обновления сертификата этого блога:
12 11 10 * * root /usr/local/bin/acme-nginx -d prolinux.org -d www.prolinux.org 2>&1 >> /var/log/letsencrypt.log
Всем SSL!