Найти в Дзене
DevOpsNotes

Получение и установка сертификата Let's Encrypt для сайта в FreeBSD

Устанавливаем certbot pkg install py37-certbot
Регистрируемся с помощью certbot в Let's Encrypt, указав свой e-mail certbot register --email your@mail.com
Cоздаем директорию %DIR_LETSENCRYPT%, в которой certbot будет создавать файлы для валидации домена по HTTP mkdir -p %DIR_LETSENCRYPT%
Создаем файл /usr/local/etc/letsencrypt/cli.ini с настройками certbot email = your@mail.com
authenticator = webroot
webroot-path = %DIR_LETSENCRYPT%
post-hook = /usr/local/etc/rc.d/nginx reload
text = True
rsa-key-size = 4096
Создаем файл /usr/local/etc/nginx/letsencrypt.conf c настройками nginx для валидации домена по HTTP.
%DIR_LETSENCRYPT% заменяем на директорию, куда будет записывать данные для проверки certbot (webroot-path) # Разрешает домену пройти проверку на выдачу SSL сертификата
# и дальнейшее его продление
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /%DIR_LETSENCRYPT%;
} # Скрывает /acme-challenge и возвращает 404 на все запросы
location

Устанавливаем certbot

pkg install py37-certbot


Регистрируемся с помощью certbot в Let's Encrypt, указав свой e-mail

certbot register --email your@mail.com


Cоздаем директорию
%DIR_LETSENCRYPT%, в которой certbot будет создавать файлы для валидации домена по HTTP

mkdir -p %DIR_LETSENCRYPT%


Создаем файл
/usr/local/etc/letsencrypt/cli.ini с настройками certbot

email = your@mail.com
authenticator = webroot
webroot-path = %DIR_LETSENCRYPT%
post-hook = /usr/local/etc/rc.d/nginx reload
text = True
rsa-key-size = 4096


Создаем файл
/usr/local/etc/nginx/letsencrypt.conf c настройками nginx для валидации домена по HTTP.
%DIR_LETSENCRYPT% заменяем на директорию, куда будет записывать данные для проверки certbot (webroot-path)

# Разрешает домену пройти проверку на выдачу SSL сертификата
# и дальнейшее его продление
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /%DIR_LETSENCRYPT%;
}
# Скрывает /acme-challenge и возвращает 404 на все запросы
location = /.well-known/acme-challenge/ {
return 404;
}


Файл letsencrypt.conf нужно будет добавить в конфигурацию nginx во все
server, для сайтов которых обновляются сертификаты:

include /usr/local/etc/nginx/letsencrypt.conf;


Тестируем запрос сертификатов для доменов mydomain.com и www.mydomain.com (опция
--dry-run)

certbot certonly --dry-run -d mydomain.com -d www.mydomain.com


Получаем сертификат для доменов mydomain.com и www.mydomain.com:

certbot certonly -d mydomain.com -d www.mydomain.com


Добавление нового поддомена (необходимо перечислить существующие и добавить новый)

certbot certonly --expand -d mydomain.com -d www.mydomain.com -d new.mydomain.com


В
cron добавляем задание (раз в сутки) для проверки необходимости обновления сертификатов

29 0 * * * /usr/local/bin/certbot renew --quiet --allow-subset-of-names

--allow-subset-of-names - при обновлении пропускать домены, для которых нельзя подтвердить владение.

Отзыв сертификата (%MY_DOMAIN% заменить на домен, для которого отзываем сертификат)

certbot revoke --cert-path /usr/local/etc/letsencrypt/live/%MY_DOMAIN%/cert.pem


Удаление сертификатов

certbot delete --cert-name mydomain.com

Настройка домена для работы по HTTPS

Cоздаем ключ Diffie-Hellman

openssl dhparam -out /usr/local/etc/nginx/mydomain.com_dh.pem 2048


В конфигурацию nginx, для домена
%MY_DOMAIN% прописываем сертификат. %MY_DOMAIN% заменяем на требуемый домен.

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/%MY_DOMAIN%/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/%MY_DOMAIN%/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/%MY_DOMAIN%/chain.pem;
ssl_dhparam /usr/local/etc/nginx/%MY_DOMAIN%_dh.pem;
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_ecdh_curve X25519:prime256v1:secp384r1;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 1.1.1.1 1.0.0.1 valid=300s;
resolver_timeout 5s;