Как получить сертификат Let’s Encrypt
В последнее время забота о безопасности и приватности пользователей набирает обороты. Когда проектировался интернет и протокол HTTP, о таких понятиях не думали. Поэтому весь трафик, передаваемый между веб-сервером и пользователем по протоколу HTTP, может быть просмотрен кем угодно, кто находится на пути этого трафика, например провайдером или хакерами.
Поэтому был придуман протокол HTTPS, который позволяет шифровать трафик и таим образом обезопасить его от перехвата. Для шифрования используются SSL-сертификаты. Раньше эти сертификаты стояли денег, но благодаря компании Let’s Encrypt теперь любой веб-сайт может установить SSL-сертификат и настроить шифрование абсолютно бесплатно. В этой статье мы рассмотрим, как получить сертификат Let’s Encrypt с помощью официального клиента Certbot.
Получение сертификата Let’s Encrypt
Вообще, нам не обязательно использовать именно Certbot, мы могли бы создать сертификат в OpenSSL, а затем просто подписать его с помощью ACME API от Let’s Encrypt. Но к этому API надо выполнять запросы в формате JSON, что очень неудобно делать из командной строки, поэтому лучше использовать один из клиентов. Например Certbot. К тому же, большинство клиентов ACME уже включают автоматическую генерацию сертификата в OpenSSL.
1. Синтаксис и команды Certbot
Прежде чем перейти к работе, давайте рассмотрим синтаксис утилиты Certbot и её команды. Они выглядят достаточно просто:
certbot команда опции -d домен
Команды используются для того, чтобы сообщить утилите, что именно надо сделать. Вот основные из них:
- run — используется по умолчанию, если никакая команда не указана, получает и устанавливает сертификат;
- certonly — только получает или обновляет сертификат, но не устанавливает его;
- renew — обновляет сертификат;
- enhance — добавляет настройки безопасности для существующих сертификатов;
- certificates — отображает установленные сертификаты;
- revoke — отзывает сертификат;
- delete — удаляет сертификат;
- register — создает ACME-аккаунт;
Как видите, команд не так много, и теперь вы в них точно не запутаетесь, а теперь разберём основные опции:
- -d — указывает домен или список доменов, разделённых запятыми, для которых надо получить сертификаты;
- —apache — использовать плагин apache для установки сертификата;
- —nginx — использовать плагин nginx;
- —standalone — запускать собственный веб-сервер для аутентификации при получении сертификата;
- —preferred-challenges — позволяет выбрать способ аутентификации, по умолчанию http, но можно выбрать dns;
- —server — позволяет указать адрес ACME-сервера, нужно для WildCard-сертификатов, поскольку они поддерживаются только второй версией ACME;
- —webroot — поместить файлы аутентификации в папку веб-сервера;
- -w — указывает папку веб-сервера, куда надо поместить файлы аутентификации;
- —manual — создание сертификата в ручном режиме;
- -n — запустить утилиту в не интерактивном режиме;
- —dry-run — тестовый запуск без сохранения изменений на диск.
Теперь мы готовы к тому, чтобы перейти к работе с утилитой. Сначала установим её.
2. Установка Certbot
Сначала необходимо установить утилиту Certbot. Это официальный клиент, и он есть в репозиториях большинства дистрибутивов. Установка Certbot в Ubuntu выполняется из PPA:
sudo apt install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt install certbot


Если вы знаете, для какой платформы будут генерироваться сертификаты, то можно установить отдельные расширения для них, они позволяют автоматически редактировать конфигурацию. Например, вы можете установить модуль для apache или nginx:
sudo apt install python-certbot-apache sudo apt install python-certbot-nginx
Эти плагины нужны, если вы собираетесь использовать соответствующие опции для автоматической установки.
3. Создание сертификата без установки
Если вам нужен сертификат для веб-сервера, который не поддерживается программой, вам придётся устанавливать его вручную. Получить такой сертификат можно с помощью команды certonly:
sudo certbot certonly —webroot -w /var/www/test.losst.pro -d test.losst.pro -d www.test.losst.pro

Эта команда получает сертификат для доменов test.losst.pro и www.test.losst.pro. Файлы для подтверждения аутентификации будут размещены в каталоге /var/www/example/. Также вы можете использовать встроенный веб-сервер для аутентификации:
sudo certbot certonly —standalone -d test.losst.pro -d www.test.losst.pro
Во время генерации сертификата утилита спросит ваш Email-адрес для аккаунта ACME, на который будут приходить уведомления о необходимости продления и другая информация:

Затем вам предложат подтвердить, что вы прочитали правила использования сервиса, ответьте А:

Далее вас спросят, хотите ли вы сделать ваш Email публичным:

Только после этого начнётся получение сертификата. Если всё прошло успешно, то ваш сертификат будет сохранён в /etc/letsencrypt/live/имя_домена/, оттуда вы уже можете использовать их в своих приложениях. Если же возникли ошибки, то утилита сообщит об этом.

4. Создание сертификата для Nginx
Вам не обязательно вручную устанавливать сертификаты, вы можете использовать один из доступных плагинов для автоматического обновления конфигурации. Например, рассмотрим использование плагина для Nginx:
sudo certbot run —nginx
Дополнительные параметры задавать не надо, потому что утилита сама прочитает конфигурацию и выведет список доступных доменов:

Введите цифру нужного домена или несколько цифр, разделённых запятой. Утилита сама установит всё, что нужно, а затем спросит вас, нужно ли перенаправлять http-трафик на https:

Затем утилита выдаст ту же информацию, что и в предыдущем варианте:

5. Обновление сертификата Let’s Encrypt
Чтобы выполнить обновление сертификата Let’s Encrypt, достаточно запустить команду certbot с опцией certonly. Учитывая, что сертификат находится в папке certbot, а конфигурация веб-сервера настроена именно на эту папку, то этой операции достаточно. Если же сертификаты копируются в другую папку, то вам понадобится скрипт для их автоматического копирования после обновления.
sudo certbot certonly -d test.losst.pro -d www.test.losst.pro

Если срок службы сертификата ещё не вышел и обновление не требуется, утилита спросит вас, действительно ли это надо сделать.
Если вы хотите обновлять сертификат в не интерактивном режиме, например с помощью скрипта, то нужно использовать опцию -n, также при использовании этой опции надо передать плагин, который будет использоваться для аутентификации:
sudo certbot certonly —nginx -n -d test.losst.pro -d www.test.losst.pro

Теперь можно добавить эту команду в планировщик cron, например раз в неделю:
0 0 * * 0 /usr/bin/certbot certonly —nginx -n -d test.losst.pro -d www.test.losst.pro
Если вы хотите обновить сертификаты для всех доменов одной командной в не интерактивном режиме, достаточно выполнить команду:
sudo certbot renew
6. Получение Wildcard сертификата Let’s Encrypt
Let’s Encrypt Wildcard-сертификаты появились относительно недавно. Они позволяют использовать один сертификат для всех поддоменов определённого домена, например *.test.losst.pro. Но и работает это всё сложнее — вам надо будет подтвердить, что этот домен принадлежит именно вам. Для этого надо добавить TXT-запись к зоне домена.
Вы можете сделать это вручную или же использовать dns-плагин для Certbot, чтобы добавить её автоматически. Правда, плагин поддерживается только для популярных сервисов, таких, как DigitalOcean, Linode, Cloudflare и так далее. В этой статье рассмотрим ручной вариант. Команда для генерации сертификата будет выглядеть вот так:
sudo certbot certonly —agree-tos -d test.losst.pro -d *.test.losst.pro —preferred-challenges dns —manual —server https://acme-v02.api.letsencrypt.org/directory

Вам надо будет разрешить публикацию вашего IP-адреса, а потом добавить TXT-запись с нужным именем и значением к вашей доменной зоне. В моем случае это _acme-challenge.test.losst.pro со специальным хэшем:

Нужная TXT-запись в службе dmains.webmoney.ru выглядит вот так:

На обновление доменной зоны может уйти несколько часов, поэтому команду придётся выполнить ещё пару раз позже. После генерации сертификата вы можете использовать его как обычный сертификат для всех поддерживаемых доменов.
How can I renew Let's Encrypt certificates?
This article discusses how to renew Let’s Encrypt SSL certificates that you have installed on your Droplet. It does not pertain to the Let’s Encrypt certificates that DigitalOcean manages for load balancers.
Let’s Encrypt uses the client Certbot to install, manage, and automatically renew the certificates they provide. In the case where your certificate does not automatically renew on your Droplet, you can manually trigger the renewal at anytime by running:
If you have multiple certificates for different domains and you want to renew a specific certificate, use:
The —force-renew flag tells Certbot to request a new certificate with the same domains as an existing certificate. The -d flag allows you renew certificates for multiple specific domains.
Получаем и обновляем SSL сертификат Let’s Encrypt
Не так давно в промышленную эксплуатацию был запущен центр сертификации Let’s Encrypt.
От всех прочих провайдеров SSL сертификатов его отличает две главные особенности.
Во-первых, Let’s Encrypt позволяет получить (и в ряде случаев даже установить) полученный сертификат в вашу систему в автоматическом режиме, а, во-вторых, сделать это совершенно бесплатно.
Сочетание этих двух факторов даёт возможность легко получить, быстро установить и забыть об обновлении полученного (одного или нескольких) SSL сертификатов в будущем.
Итак, небольшой how-to который был подготовлен на базе настройки этого самого блога.
Имеем сервер на FreeBSD где, помимо прочего, работает веб-сервер Lighttpd.
1. Устанавливаем официальный клиент Let’s Encrypt
Удобнее всего это сделать из дерева портов системы.
Сам сайт и система управления им расположены по стандартными системным путям.
Добавим в конфигурацию Lighttpd секцию для обслуживания сайта.
2. Получаем SSL сертификат
Ввиду того, что мы уже имеем развёрнутый и работающий веб-сервер, воспользуемся для получения сертификата методом webroot (подробнее о доступных методах см. certbot -h).
Немного об опциях:
- certonly — получаем сертификат, но не устанавливаем его автоматически;
- —agree-tos — соглашаемся с условиями сервиса;
- —email — предоставляем контактный e-mail, это обязательный параметр;
- —webroot — подтверждаем право владения доменом через запрос кода по HTTP;
- -w — путь к контенту сайта для временного размещения кода;
- -d — домены, которые будет подтверждать данный сертификат. В данном случае, мы выписываем в один сертификат сразу два доменных имени. Let’s Encrypt позволяет включить в него до 100 доменов одновременно. К сожалению, и это первый относительный минус данного центра сертификации, он не поддерживает т.н. wildcard, которые позволяют покрыть все домены более низкого уровня по отношению к базовому.
Как видно, клиент сообщил об успешном получении нами SSL сертификата для запрошенных доменов и сообщил путь к месту его размещения.
Обратите внимание, что предложенный путь ведёт на ссылки на сертификаты (симлинки), а не сами файлы, которые хранятся в другом месте.
Здесь мы видим автоматически сгенерированный набор сертфикатов и их индекс — версию (в данном случае 1):
- cert1.pem — сам публичный сертификат для наших доменов;
- chain1.pem — корневые сертификаты центра сертификации Let’s Encrypt;
- fullchain1.pem — полная цепочка сертификатов, включающая cert1.pem и chain1.pem;
- privkey1.pem — закрытый ключ сертификата.
В связи с тем, что Lighttpd требует предоставления файла сертификата, который включает в себя публичную и закрытую его части создадим его вручную под именем privandcert.pem.
Создадим также и ссылку на него в принятом для данной системы месте.
3. Подключаем полученные сертификаты к сайту
Обратите внимание, что поскольку на сервере размещён не один только сайт, то используется несколько наборов сертификатов. В качестве базового при начальном соединении используется SSL сертификат для домена my.server, а после посредством механизма TLS SNI предоставляется уже необходимый. Если вы размещаете только один сайт или используете единый для всех сертификат, вы можете обойтись без секции $HTTP["host"] прописав путь к вашему единственному сертификату по аналогии с my.server в вышеприведённом файле конфигурации.
4. Настраиваем механизм автоматического обновления сертификатов
Все сертификаты, выдаваемые Let’s Encrypt имеют срок действия в 90 дней и это его второй относительный минус. Столь короткий срок, равно как и отсутствие возможности использования wildcard, обусловлены заботой о повышении уровня безопасности сертифицируемых доменов. Обновление всей базы полученых SSL сертификатов производится простой командой.
Как видно, обновления не произошло, поскольку используются "свежие" сертификаты. Однако, если бы до срока их окончания оставалось 30 дней и меньше они были бы обновлены в автоматическом режиме. При этом индексный номер самих файлов сертификатов получил бы следующее по порядку значение.
Зная это, напишем простой shell-скрипт для автоматического обновления базы сертификатов по cron.
В данном случае при его выполнении будет произведена проверка сроков действия имеющихся в хранилище сертификатов и в случае их возраста старше 60 дней будет произведена их автоматическая замена. В последнем случает будет подготовлен и новый совместный файл публичной и закрытой части сертификата для Lighttpd и произведена его переинициализация.
Добавим задание в cron для еженедельной проверки и обновления выданных Let’s encrypt сертификатов.
5. PROFIT!
Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.
Установка и обновление сертификата Let’s encrypt для почтового сервера Zimbra
В прошлый статьях нас попросили рассказать об установке и обновлении сертификатов Let’s Encrypt.
Let’s Encrypt — центр сертификации, предоставляющий бесплатные криптографические сертификаты X.509 для TLS шифрования (HTTPS). Процесс выдачи сертификатов полностью автоматизирован.
Выдача Let’s Encrypt
Запрос на Let’s Encrypt желательно выполнить на сервере с Zimbra, чтобы получить сертификат SSL, CA Intermediate и Private Key. Для этого необходимо остановить службу почтового сервера (порты 80 и 443):
1. Останавливаем службы.
zmproxyctl stop
zmmailboxdctl stop
2. Загружаем пакет Let’s Encrypt и заходим в каталог letencrypt:
Примечание. В RedHat и CentOS 6 перед установкой вам нужно будет включить репозиторий EPEL.
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

3. Запустите автоматический скрипт Let’s Encrypt, используйте параметр certonly.
/tmp/letsencrypt# ./letsencrypt-auto certonly —standalone
Сценарий настроит временный WEB-сервер для проверки и выдачи сертификата, при необходимости соглашаясь с лицензией и сообщив электронную почту:

Если вам нужно иметь несколько имен хостов на одном и том же SSL, то вместо этого следует использовать протокол Multi-SAN, SSL, где -d — ваши домены:
/tmp/letsencrypt# ./letsencrypt-auto certonly —standalone -d xmpp.example.com -d conference.example.com
4. Если все будет хорошо с проверкой, то сертификат (сертификат + открытый ключ + цепочка) будет выпущен в формате «/etc/letencrypt/live/address/»:

5. На этом этапе вы можете снова запустить сервис и начать установку подписанного сертификата. Чтобы реализовать сертификат в Zimbra вам нужно дополнить цепочку «root CA». Создайте файл с «root CA» и строками файла «fullchain1.pem»)
root CA: (https://www.identrust.com/certificates/trustid/root-download-x3.html)
6. После того, как файл был создан, проверьте файлы с помощью следующей команды:
/opt/zimbra/bin/zmcertmgr verifycrt comm privkey.pem cert.pem CHAIN_COMPLETA.pem
7. Выполните проверку, создайте резервные копии текущих сертификатов (настоятельно рекомендуется) и скопируйте секретный ключ в каталог «/opt/zimbra/ssl/zimbra/commercial» с именем «commercial.key»:
cp -a /opt/zimbra/ssl/zimbra /opt/zimbra/ssl/zimbra.$(date «+%Y%m%d»)
cp privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
8. Выполните установку сертификата и перезапустите службы для проверки развертывания
/opt/zimbra/bin/zmcertmgr deploycrt comm cert.pem chain.pem
9. Правильная установка сертификата:

10. Перезагрузите сервис
Обновление сертификатов
1. Останавливаем Zimbra.
2. Получаем новые сертификаты и запускаем почтовый сервер.
certbot certonly —standalone -d mail.example.com
/etc/init.d/zimbra start
3. Полученные сертификаты потребуется загрузить в Zimbra. Копируем сертификаты:
cp /etc/letsencrypt/live/zimbra86.zimbra.io/* /opt/zimbra/ssl/letsencrypt/
chown zimbra:zimbra /opt/zimbra/ssl/letsencrypt/
cd /opt/zimbra/ssl/letsencrypt/
4. В конец файла chain.pem добавляем промежуточный сертификат Let’s encrypt:
——BEGIN CERTIFICATE——
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
——END CERTIFICATE——
Если вы не добавите промежуточный сертификат, то получите ошибку на этапе проверки:
ERROR: Unable to validate certificate chain: cert.pem: C = US, O = Let’s Encrypt, CN = Let’s Encrypt Authority X3
error 2 at 1 depth lookup:unable to get issuer certificate
5. Проверяем установленные ключи и сертификаты:
su zimbra
$ cp /opt/zimbra/ssl/letsencrypt/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
$ /opt/zimbra/bin/zmcertmgr verifycrt comm privkey.pem cert.pem chain.pem
6. Если проверка прошла успешно, то устанавливаем обновленные сертификаты:
$ /opt/zimbra/bin/zmcertmgr deploycrt comm cert.pem chain.pem
7. Для применения установленного сертификата перезапустите все сервисы Zimbra:
Те же, кто желает автоматизировать процесс установки новых сертификатов, могут воспользоваться специальным скриптом, опубликованным на сайте GitHub.
Для того, чтобы все работало, необходимо:
Установить утилиту Certbot при помощи команды yum -y install certbot
Затем клонировать указанную ветку с помощью команды git clone github.com/penzoiders/zimbra-auto-letsencrypt.git
Отредактировать файл letsencrypt-zimbra.conf, чтобы он соответствовал вашей системе
Перейти в папку со скриптом и его с помощью ./zimbra-auto-letsencrypt.sh
Обращаем ваше внимание на то, что скрипт не только самостоятельно обновит сертификат, но также перезапустит все сервисы, которые потребуется. Использование скрипта можно полностью автоматизировать, настроив его исполнение через определенный временной интервал.