Получение сертификата Let's Encrypt для HTTPS при помощи Certbot в FreeBSD 14.1
Сайт по незащищенному протоколу HTTP в 2024 года? Любой сайт должен работать через HTTPS, а для этого нужен сертификат которому доверяют веб-браузеры. Существует сервис Let's Encrypt который выдает бесплатно сертификаты для сайта сроком на 3 месяца, а после можно бесплатно их перевыпустить. Для управления и автоматического обновления сертификатов существует утилита Certbot. В статье будет рассмотрена работа Certbot в FreeBSD и настройка nginx для работы с HTTPS протоколом.
1. Установка Certbot
Устанавливаем через пакеты
pkg install py311-certbot
Или устанавливаем из портов
cd /usr/ports/security/py-certbot/ && make install clean
После установки было выведено сообщение: что можно установить плагины для автоматической настройки Apache или Nginx, как включить автоматическое обновление сертификатов.
В статье будет показан процесс ручной настройки и добавление сертификатов в веб-сервер nginx и включение автоматического обновления сертификатов Let's Encrypt.
2. Создание аккаунта Let's Encrypt
Создаем аккаунт командой:
certbot register
Указываем свой email адрес
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): tommywirser@notby.net
Соглашаемся с договором по использованию Let's Encrypt
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Отказываемся от передачи своего email адреса и получения новостей и рекламы
Would you be willing, once your first certificate is successfully issued, 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
Аккаунт успешно создан.
3. Получение сертификата для сайта
Для получения сертификата используем команду:
certbot certonly -d notby.net
где notby.net — доменное имя сайта для которого необходимо выпустить сертификат Let's Encrypt.
Будет преложено два варианта как проверить собственность доменного имени сайта:
- запустить встроенный веб-сервер certbot (не походит, так как уже есть рабочий веб-сервер);
- использовать рабочий веб-сервер, например nginx.
Выбираем 2 вариант
Далее необходимо указать путь до каталога сайта. В каталоге сайте будет создан каталог .well-known/acme-challenge/ с файлами для проверки домена.
Указываем каталог сайта
Нажимаем Enter и дожидаемся завершение процесса получения сертификата.
Сертификат Let's Encrypt успешно выдан сроком на 3 месяца.
Аналогично происходит получение сертификатов для других сайтов, если это необходимо. Можно получить сертификаты для неограненного количества сайтов.
Если во время получения сертификата произошла ошибка, возможны следующие причины:
- Для утилиты certbot недостаточно прав на создание каталога проверки домена внутри каталога сайта;
- Невозможно получить доступ по URL адресу http://<домен>/.well-known/acme-challenge/.
Проверяем что каталог сайта имеет права как минимум 5 (r-x) для пользователя веб-сервера или любых пользователей.
ls -lh /usr/local/www/
drwxr-x--- 2 www www 1.0K Feb 21 12:33 notby.net
Добавляем в конфигурацию nginx в раздел настроек сайта следующие строки:
location /.well-known {
root /usr/local/www/notby.net/; # Каталог сайта.
}
4. Настройка nginx для работы с HTTPS
Настраиваем nginx на обслуживания сайта через HTTPS по 443 порту с указанием путей сертификатов Let's Encrypt и перенаправление всего трафика с HTTP на HTTPS.
Открываем конфигурационный файл настроек для сайта или nginx.conf, вносим измерения в раздел настроек сайта
# Вместо домена notby.net указывай свой домен сайта.
# Блок server для домена notby.net по 80 порту (HTTP).
server {
listen 80; # Порт сервера.
server_name notby.net; # Домен сайта.
# Настройка location для получения Let's Encrypt сертификата через HTTP, можно перенести в раздел HTTPS.
# Каталог .well-known будет создан certbot'ом на время получения сертификата Let's Encrypt.
location /.well-known {
root /usr/local/www/notby.net/;
}
#Перенаправление всего трафика с http на https.
location / {
return 301 https://$host$request_uri;
}
}
# Блок server для домена notby.net по 443 порту (HTTPS).
server {
listen 443 ssl; # 443 порт, поддержка SSL.
http2 on; # Использовать HTTP/2.
server_name notby.net; # Домен сайта.
# Пути к списку сертификатов, на моменте выдачи сертификата они были указаны.
ssl_certificate /usr/local/etc/letsencrypt/live/notby.net/fullchain.pem;
ssl_certificate_key /usr/local/etc/letsencrypt/live/notby.net/privkey.pem;
# Сертификат для параметра ssl_stapling
ssl_trusted_certificate /usr/local/etc/letsencrypt/live/notby.net/chain.pem;
ssl_protocols TLSv1.3; # Разрешенные протоколы (только TLS 1.3).
ssl_prefer_server_ciphers off; # Использовать клиентские шифры.
# OCSP stapling, для ssl_stapling обязательный ssl_trusted_certificate параметр.
ssl_stapling on;
ssl_stapling_verify on;
# Настройки location оставляем как было раньше или меняем если что-то нужно поменять. -:)
location / {
root /usr/local/www/notby.net/; # Каталог сайта.
index index.html index.php; # Файлы в качестве индекса.
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /usr/local/www/notby.net/$fastcgi_script_name;
include fastcgi_params;
}
}
Сохраняем файл и перезапускаем веб-сервер nginx
service nginx restart
5. Проверка HTTPS и перенаправление с HTTP
Открываем в веб-браузере свой сайт по протоколу http://<адрес сайта>/, должно произойти автоматическое перенаправление на https://<адрес сайта>/
Нажимаем значок рядом с адресом сайта и видим что сайт работает по защищенному соединению с сертификатом Let's Encrypt.
Теперь все пользователя будет автоматически перенаправлятся на HTTPS протокол, даже не заметив каких-то измерений.
Поисковые системы также со временем изменят протокол сайта или можно зайти в панель управления сайтами в поисковой системе и указать что сайт переехал на HTTPS.
6. Проверка обновлений сертификатов
После настройки веб-сервера запускаем проверку получения нового сертификата
certbot renew --dry-run
Параметр --dry-run указывает что будет происходить симуляция получения нового сертификата.
Тестовое получение сертификата успешно пройдено.
7. Автоматическое обновление сертификатов
Утилиту Certbot необходимо добавить в файл /etc/periodic.conf (периодическое выполнение заданий), чтобы она автоматически перевыпустила сертификаты сайтов, срок действия которых заканчивается.
Открываем в текстовом редакторе файл /etc/periodic.conf или создаем его
nano /etc/periodic.conf
Добавляем строку
weekly_certbot_enable="YES"
Сохраняем файл. Теперь раз в неделю будет происходить проверка сертификатов сайтов и если сертификату остается меньше двух недель, он будет обновлен автоматически.
8. Изменение email адреса аккаунта
Если в дальнейшим потребуется изменить email адрес аккаунта Let's Encrypt, используем команду:
certbot update_account --email new@email.com
где new@email.com — новый email адрес.
Будет предложено подписатся на новости и немного рекламы, отвечаем N если неинтересно.
Email адрес успешно обновлен.