Инструменты пользователя

Инструменты сайта


freebsd:network:letsencrypt

Это старая версия документа!


Давайте зашифруем дикие карты!


Введение

Для того, чтобы шифровать трафик нам необходим 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 # подгружаем переменные из 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="sendmail apache24 dovecot"

и создаем в /etc/crontab задачу на запуск скрипта:

@weekly     root    /root/bin/cert_renew.sh

</code>

При возникновение проблем с перевыпуском сертификата на стороне Let's Encrypt на email, указанный при регистрации аккаунта, придет соответсвующее письмо.

certbot renew --renew-hook 'service apache24 restart && service sendmail restart && service dovecot restart && service strongswan restart'
freebsd/network/letsencrypt.1592242162.txt.gz · Последнее изменение: andrei