Для того, чтобы шифровать трафик нам необходим SSL сертификат. Его конечно можно выпустить самому, но тогда браузеры, почтовые клиенты и т.д. будут постоянно на него ругаться, а некоторые пользователи очень пугаются когда видят подобные сообщения. Поэтому для того, чтобы лишний раз не расшатывать психику пользователей, мы воспользуемся услугами центра сертификации Let's Encrypt.
Let's Encrypt я выбрал потому что:
Действие сертификата ограничивается 90 днями, но это не проблема, так как процедуру его продления можно легко автоматизировать.
На момент написания данной статьи, Let's Encypt позволяет выпускать wildcard-сертификат только по «dns авторизации». Поэтому мы начнем настройку с DNS сервера.
Для подтверждения Ваших прав на домен, Let's Encrypt просит временно добавить уникальную строку-идентификатор, которую любым способом необходимо разместить в специальной TXT-записи нижеследующего формата, чтобы проверяющий сервер Let's Encrypt мог считать её и удостовериться, что мы владеем или управляем указанным DNS-сервером:
_acme-challenge.nzgw.ru. 120 IN TXT "ivM...6sw"
Поскольку мы не хотим делать это каждый раз в ручную, нам придется настроить автоматическое обновление зон. Начнем с генерации TSIG-ключа («Transaction SIGnature») для подписания запросов к DNS серверу:
tsig-keygen -a hmac-sha512 tsig-key
Результат выполнения команды:
key "tsig-key" {
algorithm hmac-sha512;
secret "Eb9qKOHx3fcdx1cxaHS//j3V75IAijsPD/mvZfUEqQydkNnBway2yAU9waiCLG+ocgEmxRQFsTiISfZXMVGaug==";
};
Его надо скопировать целиком ( в последствии заменив имя самого ключа) и поместить в файл настройки Bind, и дополнить настройки зоны директивой update-policy.
named.conf:
key "letscrypt-nzgw.ru" {
algorithm hmac-sha512;
secret "Eb9qKOHx3fcdx1cxaHS//j3V75IAijsPD/mvZfUEqQydkNnBway2yAU9waiCLG+ocgEmxRQFsTiISfZXMVGaug==";
};
zone "nzgw.ru" {
type master;
file "/usr/local/etc/namedb/master/db.nzgw.ru";
update-policy {
grant letscrypt-nzgw.ru name _acme-challenge.nzgw.ru. txt;
};
# Secondary DNS
notify yes;
also-notify { 222.222.222.222; };
allow-transfer { 222.222.222.222; };
allow-query { any;};
};
на этом настройка DNS сервера закончена. Перезапускаем сервис:
service named restart
Теперь необходимо установить наборы скриптов для выпуска и продления сертификатов. Нам потребуются:
pkg install py37-certbot pkg install py37-certbot-dns-rfc2136
Завершающим этапом будет создания файла с настройками для плагина certbot-dns-rfc2136.
touch /usr/local/etc/letsencrypt/nzgw.ru.rfc2136.ini chown root:wheel /usr/local/etc/letsencrypt/nzgw.ru.rfc2136.ini chmod 0600 /usr/local/etc/letsencrypt/nzgw.ru.rfc2136.ini
Содержимое файла:
dns_rfc2136_server = 111.111.111.111 dns_rfc2136_name = letscrypt-nzgw.ru dns_rfc2136_secret = Eb9qKOHx3fcdx1cxaHS//j3V75IAijsPD/mvZfUEqQydkNnBway2yAU9waiCLG+ocgEmxRQFsTiISfZXMVGaug== dns_rfc2136_algorithm = HMAC-SHA512
где:
Регистрация аккаунта:
certbot register --email email@server.com --agree-tos
Где:
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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: y IMPORTANT NOTES: - Your account credentials have been saved in your Certbot configuration directory at /usr/local/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.
Команда для выпуска сертификата:
certbot certonly --dns-rfc2136 \ --dns-rfc2136-credentials /usr/local/etc/letsencrypt/nzgw.ru.rfc2136.ini \ --preferred-challenges=dns \ --agree-tos \ --manual-public-ip-logging-ok \ -d nzgw.ru,'*.nzgw.ru'
Где:
Если мы все правильно настроили, и DNS авторизация прошла успешно, то мы получим следующее сообщение:
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator dns-rfc2136, Installer None Obtaining a new certificate IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /usr/local/etc/letsencrypt/live/nzgw.ru/fullchain.pem Your key file has been saved at: /usr/local/etc/letsencrypt/live/nzgw.ru/privkey.pem Your cert will expire on 2020-09-12. 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
Файлы выпушеного сертификата можно найти в /usr/local/etc/letsencrypt/live/nzgw.ru/
lrwxr-xr-x 1 root wheel 31 Jun 14 23:55 cert.pem -> ../../archive/nzgw.ru/cert1.pem lrwxr-xr-x 1 root wheel 32 Jun 14 23:55 chain.pem -> ../../archive/nzgw.ru/chain1.pem lrwxr-xr-x 1 root wheel 36 Jun 14 23:55 fullchain.pem -> ../../archive/nzgw.ru/fullchain1.pem lrwxr-xr-x 1 root wheel 34 Jun 14 23:55 privkey.pem -> ../../archive/nzgw.ru/privkey1.pem
Где:
Для того, чтобы веб сервер apache начал использовать выпущенный сертификат, необходимо в его конфиг добавить следующие строки:
SSLEngine on SSLCertificateFile "/usr/local/etc/letsencrypt/live/nzgw.ru/cert.pem" SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/nzgw.ru/fullchain.pem" SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/nzgw.ru/privkey.pem" SSLCACertificateFile "/usr/local/etc/letsencrypt/live/nzgw.ru/chain.pem"
Перезапускаем сервис и пробуем зайти на сайт по HTTPS.
Если шифрования планируется использовать только для HTTPS, то для автоматического перевыпуска сертификата достаточно добавить в файл /etc/periodic.conf следующие две строчки:
weekly_certbot_enable="YES" weekly_certbot_service="apache24"
Теперь FreeBSD раз в неделю будет запускать соответсвующий скрипт, и при необходимости будет перевыпускать сертификат и перезапускать apache.
Но поскольку у меня несколько сервисов пользуются этим сертификатом несколько сервисов, то пришлось написать небольшой скрипт:
#!/bin/sh
. /etc/rc.conf # подгружаем переменные из rc.conf
HOOK=""
# Проверяем наличие нужной нам переменной
# и если она есть составляем команды для параметра --renew-hook
if [ -n "$certbot_service" ]
then
for i in $certbot_service
do
if service $i onestatus # если сервис запущен, добавляем его
then
if [ -n "$HOOK" ]
then
HOOK="$HOOK ; "
fi
HOOK="$HOOK service $i restart"
fi
done
fi
/usr/local/bin/certbot renew --renew-hook "$HOOK"
Добавляем в файл /etc/rc.conf перечень сервисов, которые надо перезапускать после перевыпуска сертифика:
certbot_service="apache24 sendmail dovecot"
и создаем в /etc/crontab задачу на запуск скрипта:
@weekly root /root/bin/cert_renew.sh
При возникновение проблем с перевыпуском сертификата на стороне Let's Encrypt на email, указанный при регистрации аккаунта, придет соответсвующее письмо.