Это старая версия документа!
Содержание
Давайте зашифруем дикие карты!
Введение
Для того, чтобы шифровать трафик нам необходим SSL сертификат. Его конечно можно выпустить самому, но тогда браузеры, почтовые клиенты и т.д. будут постоянно на него ругаться, а некоторые пользователи очень пугаются когда видят подобные сообщения. Поэтому для того, чтобы лишний не расшатывать психику пользователей, мы воспользуемся услугами центра сертификации Let's Encrypt.
Let's Encrypt я выбрал потому что:
- с помощью этого центра можно выпускать (а в ряде случаев даже установить) и продлевать полученные сертификаты в нашу систему в автоматическом режиме;
- он позволяет выпускать wildcard-сертификаты;
- и при всем при это он бесплатный;
Действие сертификата ограничивается 90 днями, но это не проблема, так как процедуру его продления можно легко автоматизировать.
Подготовка
На момент написания данной статьи, Let's Encypt позволяет выпускать wildcard-сертификат только по «dns авторизации». Поэтому мы начнем настройку с DNS сервера.
Bind
Для подтверждения Ваши прав на домен, Let's Encrypt просит временно добавить в Вашу зону строчку вида:
_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
HOOK=""
if [ -n "$certbot_service" ]
then
HOOK_CMD="--renew-hook"
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"
При возникновение проблем с перевыпуском сертификата на стороне Let's Encrypt на email, указанный при регистрации аккаунта, придет соответсвующее письмо.
certbot renew --renew-hook 'service apache24 restart && service sendmail restart && service dovecot restart && service strongswan restart'
