Содержание
Давайте зашифруем дикие карты!
Введение
Для того, чтобы шифровать трафик нам необходим SSL сертификат. Его конечно можно выпустить самому, но тогда браузеры, почтовые клиенты и т.д. будут постоянно на него ругаться, а некоторые пользователи очень пугаются когда видят подобные сообщения. Поэтому для того, чтобы лишний раз не расшатывать психику пользователей, мы воспользуемся услугами центра сертификации Let's Encrypt.
Let's Encrypt я выбрал потому что:
- с помощью этого центра можно выпускать (а в ряде случаев даже установливать) и продлевать полученные сертификаты в нашу систему в автоматическом режиме;
- он позволяет выпускать wildcard-сертификаты;
- и при всем при этом он бесплатный;
Действие сертификата ограничивается 90 днями, но это не проблема, так как процедуру его продления можно легко автоматизировать.
Подготовка
На момент написания данной статьи, Let's Encypt позволяет выпускать wildcard-сертификат только по «dns авторизации». Поэтому мы начнем настройку с DNS сервера.
Bind
Для подтверждения Ваших прав на домен, 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
certbot
Теперь необходимо установить наборы скриптов для выпуска и продления сертификатов. Нам потребуются:
- py37-certbot - основной набор скриптов;
- py37-certbot-dns-rfc2136 плагин для автоматического обновления зоны DNS;
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
где:
- dns_rfc2136_server ip адрес мастер DNS сервера, обслуживающего зону;
- dns_rfc2136_name имя ключа, которое мы указывали при настройке Bind;
- dns_rfc2136_secret сам ключ;
Выпуск сертификата
Регистрация аккаунта:
certbot register --email email@server.com --agree-tos
Где:
- –email почтовый адрес на который будет приходить сообщения, если возникнут ошибки с продлением сертификата;
- –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'
Где:
- certonly команда на выпуск сертификата без установки;
- –dns-rfc2136 плагин для авторизацию через DNS;
- –dns-rfc2136-credentials путь к файлу с настройками авторизации;
- –preferred-challenges=dns тип авторизации;
- –manual-public-ip-logging-ok разрешение логировать IP с которого пришел запрос на выпуск сертификата;
- -d список доменов для сертификата.
Если мы все правильно настроили, и 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
Где:
- cert.pem сертификат вашего доменного имени;
- chain.pem цепочка сертификатов Let’s Encrypt;
- fullchain.pem объединённые cert.pem и chain.pem;
- privkey.pem приватный ключ вашего сертификата.
Настройка apache
Для того, чтобы веб сервер 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, указанный при регистрации аккаунта, придет соответсвующее письмо.
