Как получить бесплатный сертификат SSL у Let's Encrypt.

Дано: сервер на каком-то Дебиане(Убунту, Минт...) с несколькими виртуальными хостами, которые крутит Апач, нужно получить SSL и сделать так, что бы он обновлялся без участия человека. Всё достаточно просто, нужно добавить репозитарий и поставить специальную приблуду - certbot, уже которой можно поставить сертификат и обновлять его. Команды в терминале, если нет прав, то нужно сделать sudo su:

apt install software-properties-common
add-apt-repository ppa:certbot/certbot
apt update
apt install certbot

Давайте теперь минимально пробежимся по командам и опциям утилиты certbot, синтаксис простой: certbot [команда] [опции].

Команды:

  • run - используется по умолчанию, если никакая команда не указана, получает и устанавливает сертификат;
  • certonly - только получает или обновляет сертификат, но не устанавливает его;
  • renew - обновляет сертификат;
  • enhance - добавляет настройки безопасности для существующих сертификатов;
  • certificates - отображает установленные сертификаты;
  • revoke - отзывает сертификат;
  • delete - удаляет сертификат;
  • register - создает ACME-аккаунт;

Опции:

  • -d - указывает домен или список доменов, разделённых запятыми, для которых надо получить сертификаты, можно перед каждым элементом делать -d: -d domen.zone -d domen1.zone;
  • --apache - использовать плагин apache для установки сертификата;
  • --nginx - использовать плагин nginx;
  • --standalone - запускать собственный веб-сервер для аутентификации при получении сертификата;
  • --preferred-challenges - позволяет выбрать способ аутентификации, по умолчанию http, но можно выбрать dns;
  • --server - позволяет указать адрес ACME-сервера, нужно для WildCard-сертификатов, поскольку они поддерживаются только второй версией ACME;
  • --webroot - поместить файлы аутентификации в папку веб-сервера;
  • -w - указывает папку веб-сервера, куда надо поместить файлы аутентификации;
  • --manual - создание сертификата в ручном режиме;
  • -n - запустить утилиту в не интерактивном режиме;
  • --dry-run - тестовый запуск без сохранения изменений на диск.

Можно практически ничего не делать руками, просто запустить, например для Апача, certbot --apache и, если всё правильно установлено, если имена дирекорий соответствуют именам хостов, и т.д., то всё произойдёт само, установятся сертификаты, сконфигурируется сервер, завернётся трафик с 80 на 443 порт, только перезапустить и всё поехало. Так должно быть в идеале и так происходит почти всегда, но если хочется минимально контролировать, если в конфигах сервера есть нестандартные вещи, то стоит сделать руками, тем более, что ничего особенного не придётся делать. Так же и для Енжин-Х есть вариант: certbot --nginx.

Для пущего понимания сделаем два раздельных сертификата для двух разных виртуальных хостов, один почти автоматически, второй в интерактивном режиме. Итак, сначала интерактивно, такой командой мы говорим ACME-клиенту, что хотим создать сертификат, для проверки которого будет использован корень сайта, а остальные параметры мы введём руками, ответы, которые надо ввести с клавиатуры будут синим, нужно указать почту для связи (можно скипнуть), согласиться с условиями, разрешить слать на почту новости (я запретил), указать домен или список доменов через запятую без пробелов, и корневую директорию хоста:

certbot certonly --webroot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf.
You must agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: a

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n

Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel): domen.zone

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for domen.zone
Input the webroot for domen.zone: (Enter 'c' to cancel): /var/www/domen_root/

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/domen.zone/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/domen.zone/privkey.pem
Your cert will expire on 2022-01-19. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

 

Также можно это всё сделать не притрагиваясь к клавиатуре, давайте сделаем это, просто дав команду:

certbot certonly --webroot -w /var/www/domen_root -d domen1.zone,domen2.zone
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Obtaining a new certificate Performing the following challenges: http-01 challenge for domen1.zone http-01 challenge for domen2.zone Using the webroot path /var/www/domen_root for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/domen.zone/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/domen.zone/privkey.pem Your cert will expire on 2022-07-19. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

 

В выводе виден путь к созданным файла и совет забекапить - не пренебрегайте. В директории сертификатов лежит краткий ридми, стоит взглянуть одним глазком.
Ну, почти закончили. Теперь у нас есть сертификаты, нужно их подключить и вообще заставить Апача работать с ними. В директории /etc/apache2/sites-available находим файл конфигурации виртуального хоста, должно быть что-то вроде domen.zone.conf и сохраняем с новым именем domen.zone.ssl.conf, открывем и редактируем, меняем порт с 80 на 443, вставляем в него директивы SSL, подсматриваем пути в выводе выше, должно получиться что-то вот такое:

<VirtualHost *:443>
   DocumentRoot "/var/www/domen.zone"
   ServerName domen.zone
   SSLEngine on
   SSLCertificateFile /etc/letsencrypt/live/domen.zone/fullchain.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/domen.zone/privkey.pem

   ServerAdmin webmaster@localhost
   ErrorLog /var/log/apache2/domen.zone_error.log
   LogLevel crit
   CustomLog /var/log/apache2/domen.zone_access.log combined
   <Directory "/var/www/domen.zone">
      allow from all
      AllowOverride All
   </Directory>
</VirtualHost>

Осталось только включить шифрование на уровне серевера, включить виртуальный хост с шифрованием и перезапустить Апача:

a2enmod ssl
a2ensite domen.zone.ssl.conf
systemctl reload apache2

Теперь те, кто пойдут на 443 порт будут получать шифрованый контент, а те кто на 80 - по прежнему без шифрования. Если нужно, что бы всё заворачивались на 443 порт, то нужно поправить старый конфиг, всё в нём снести и оставить только редирект, так же завернём всё с www на просто домен:

<VirtualHost *:80>
ServerName domen.zone
ServerAlias www.domen.zone
Redirect / https://domen.zone/
</VirtualHost>


Теперь касательно обновления. Сертификат дают на 90 дней, считай три месяца. Автоматически для крона делается задание, два раза в день проверяется срок жизни и если меньше месяца, то обновляется, можно сходить и посмотреть, если не нравится - поправить: /etc/cron.d/certbot.

Вручную все установленные сертификаты обновляются одной командой: certbot renew

Для проверки, что бы не плодить лишних запросов, нужно добавить в конце --dry-run, тогда не будет обновления, а только проверка, количество запросов с одного хоста ограничено, точно я не знаю сколько, не нарывался, но помнить об этом стоит:

certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/domen.zone.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for domen.zone
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/domen.zone/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/domen1.zone.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for domen1.zone
http-01 challenge for domen2.zone
Using the webroot path /var/www/domen1.zone for all unmatched domains.
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/domen1.zone/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/domen.zone/fullchain.pem (success)
/etc/letsencrypt/live/domen1.zone/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.

Если всё сейчас происходит без ошибок, то и задание из крона должно нормально исполнится.
Ну, вот вроде и всё.