Let’s Encrypt — это бесплатный, автоматизированный и открытый Центр Сертификации. Благодаря ему нет необходимости в покупке SSL сертификата, поскольку он позволяет получить SSL сертификат для вашего домена совершенно бесплатно. Кроме того, получение и настройка осуществляется один раз и навсегда. Нет необходимости каждый 1-2 года покупать или обновлять сертификат, все это за вас сделает Certbot.
Установка Certbot в Ubuntu
Для установки Certbot может потребоваться сначала установить систему управления пакетами - snap, если у вас она еще не установлена. Чтобы установить snap выполняем следующие команды:
apt update
apt install snapd
snap install core
После установки snap мы можем установить Certbot:
snap install --classic certbot
Затем создадим символическую ссылку:
ln -s /snap/bin/certbot /usr/bin/certbot
Установку можно также осуществлять через apt (advanced packaging tool):
apt install certbot
Но установка через snap позволит получить более свежую и стабильную версию.
Настройка Certbot
В качестве настройки будем использовать метод webroot без остановки веб-сервера. Согласно протоколу ACME нам потребуется каталог, в который certbot будет писать файлы, которые будут доступны удостоверяющему серверу из сети.
В файле /etc/letsencrypt/cli.ini необходимо указать основные настройки:
authenticator = webroot
webroot-path = /var/www/certbot
post-hook = nginx -s reload
При успешном обновлении сертификатов будет выполнена команда из post-hook. В нашем случае мы перезагрузим nginx.
При указании данных настроек certbot должен создавать файлы, необходимые для проверки прав на домен в каталоге /var/www/certbot. Целевой путь будет выглядеть примерно следующим образом:
/var/www/certbot/.well-known/acme-challenge/test.html
Поэтому такие файлы должны быть доступны из сети на целевом домене по крайней мере по HTTP:
http://example.com/.well-known/acme-challenge/test.html
Для этого нам потребуется настроить наш веб-сервер. В качестве тестирования мы можем создать файл:
mkdir -p /var/www/certbot/.well-known/acme-challenge
echo "Test" > /var/www/certbot/.well-known/acme-challenge/test.html
Настройка конфигурации Nginx
В качестве настройки потребуется установить в блоке server следующую запись:
location /.well-known {
root /var/www/certbot;
}
После этого нам необходимо перезапустить nginx и убедиться, что наш тестовый файл доступен:
curl -L http://example.com/.well-known/acme-challenge/test.html
После проверки лучше удалить наш тестовый файл, чтобы certbot не показывал сообщение об ошибке (Unable to clean up challenge directory). И теперь мы можем приступать к получению сертификатов.
Получение сертификатов
Поскольку у Let's Encrypt есть лимиты на количество обращений за сертификатами, лучше всего для начала проверить, что сертификаты для целевого домена удастся получить, для этого выполняем команду ниже с флагом --dry-run. Который пытается получить сертификаты в режиме тестов:
certbot certonly --dry-run -d example.com -d www.example.com
Если все прошло успешно и сертификаты могут быть получены команда выведет следующую информацию:
The dry run was successful.
В случае неудачи certbot выведет информацию об ошибке, а также запишет расширенную информацию в лог.
При успешном выполнении команды мы можем смело получать сертификаты:
certbot certonly -d example.com -d www.example.com
После этого у вас должны появиться сертификаты для указанных доменов.
Если требуется добавить домен или поддомен в сертификат
Если вы забыли указать поддомен или требуется добавить новый домен в сертификат (необходимо учесть, что их не должно быть больше 100), в этом случае мы можем запустить команду еще раз указав дополнительные домены:
certbot certonly -d example.com -d www.example.com -d test.example.com
Вам будет предложено добавить новый домен в сертификат. Чтобы избежать вопросов можем дописать ключ:
certbot certonly --expand -d example.com -d www.example.com -d test.example.com
После одной из этих команд новый домен будет добавлен в сертификат.
Проверка сертификата
Чтобы проверить только что полученный сертификат мы можем воспользоваться следующим методом:
openssl x509 -text -in /etc/letsencrypt/live/example.com/cert.pem
Команда должна вывести информацию о нашем сертификате, включая список доменов на который данный сертификат распространяется.
Установка сертификата в Nginx
Все выпущенные сертификаты certbot помещает в виде ссылок в каталог с названием первого домена:
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/chain.pem
/etc/letsencrypt/live/example.com/privkey.pem
/etc/letsencrypt/live/example.com/cert.pem
Таким образом мы можем установить сертификат на домен в nginx следующим образом:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# далее ваши настройки
}
После установки сертификата мы можем проверить, что наш сайт работает по защищенному протоколу.
Продление сертификатов
Поскольку сертификаты выдаются всего на 3 месяца, необходимо автоматизировать процедуру обновления сертификатов, чтобы не выполнять каждый раз вышеописанные действия. Для этого достаточно добавить в /etc/cron.d/certbot подобную запись:
# добавить в /etc/cron.d/certbot что-то вроде этого
0 */12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(43200))' && certbot -q renew --allow-subset-of-names
Здесь мы проверяем существование исполняемого файла /usr/bin/certbot, если он есть засыпаем на рандомное время в пределах 43200 секунд (12 часов) и затем обновляем сертификаты. Ключ --allow-subset-of-names нужен чтобы certbot пытался получить сертификаты для частичного набора доменов. Это требуется в том случае, если подтвердить владение одного из ваших доменов не удастся, то certbot получит сертификаты для тех доменов владение которых будет подтверждено, иначе вы получите первую ошибку при проверке владения доменом и на этом все завершиться, certbot не станет получать оставшиеся сертификаты.
На этом все. Наш сертификат установлен и будет обновляться каждые 3 месяца самостоятельно, поэтому нам не потребуется ежегодно покупать и устанавливать платный сертификат.