Вопрос или проблема
Мне нужен совет о том, как правильно использовать Certbot для получения SSL-сертификатов от Let’s Encrypt. Для контекста, я делаю это в скрипте, поэтому мне нужно, чтобы это было неинтерактивно.
У меня есть базовый файл конфигурации для веб-сервиса:
server {
listen 80;
listen [::]:80;
server_name domain.tld;
root /var/www/super_site/public;
index index.php index.html;
access_log /var/log/nginx/super_site_access.log;
error_log /var/log/nginx/super_site_error.log;
location / {
try_files \$uri \$uri/ /index.php;
}
location ~ ^/(doc|sql|setup)/ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
location ~ /\.ht {
deny all;
}
}
Затем я запускаю Certbot, чтобы получить сертификаты:
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d domain.tld -d www.domain.tld
Certbot выполняет свою работу и возвращает:
Поздравляем! Вы успешно включили HTTPS на https://....
Все работает, но когда я смотрю на файл конфигурации в /etc/nginx/conf.d, он выглядит не очень аккуратно.
server {
server_name domain.tld;
root /var/www/super_site/public/;
index index.php index.html;
access_log /var/log/nginx/super_site_access.log;
error_log /var/log/nginx/super_site_error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ ^/(doc|sql|setup)/ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
location ~ /\.ht {
deny all;
}
listen [::]:443 ssl; # управляется Certbot
listen 443 ssl; # управляется Certbot
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # управляется Certbot
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; # управляется Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # управляется Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # управляется Certbot
add_header Strict-Transport-Security "max-age=31536000" always; # управляется Certbot
ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem; # управляется Certbot
ssl_stapling on; # управляется Certbot
ssl_stapling_verify on; # управляется Certbot
} server {
if ($host = domain.tld) {
return 301 https://$host$request_uri;
} # управляется Certbot
listen 80;
listen [::]:80;
server_name domain.tld;
root /var/www/super_site/public/;
index index.php index.html;
access_log /var/log/nginx/super_site_access.log;
error_log /var/log/nginx/super_site_error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ ^/(doc|sql|setup)/ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
location ~ /\.ht {
deny all;
}
}
Certbot здесь полезен:
include /etc/letsencrypt/options-ssl-nginx.conf; # управляется Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # управляется Certbot
add_header Strict-Transport-Security "max-age=31536000" always; # управляется Certbot
ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem; # управляется Certbot
ssl_stapling on; # управляется Certbot
ssl_stapling_verify on; # управляется Certbot
Потому что, в некоторых смыслах, я все еще учусь, и это показывает мне, как настроить SSL.
Когда я смотрю на документацию, я думаю, что мне следует использовать опцию ‘certonly’? И написать файл конфигурации самостоятельно.
sudo certbot certonly -n --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d domain.tld www.domain.tld
Файл конфигурации мог бы выглядеть так:
server {
if ($host = domain.tld) {
return 301 https://$host$request_uri;
}
listen 80;
listen [::]:80;
listen [::]:443 ssl;
listen 443 ssl;
server_name domain.tld;
root /var/www/super_site/public;
index index.php index.html;
access_log /var/log/nginx/super_site_access.log;
error_log /var/log/nginx/super_site_error.log;
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=31536000" always; # управляется Certbot
ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;
location / {
try_files \$uri \$uri/ /index.php;
}
location ~ ^/(doc|sql|setup)/ {
deny all;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
location ~ /\.ht {
deny all;
}
}
Использование опции ‘certonly’ — это то, что мне нужно? Или я что-то упустил? Я знаю, что мне нужно улучшить свои знания. Спасибо за ваше время и помощь.
Ответ или решение
Конечно! Давайте рассмотрим, как правильно использовать Certbot с Nginx для получения SSL-сертификатов от Let’s Encrypt в автоматическом режиме.
Общая информация о Certbot и Nginx
Certbot — это клиент для автоматизации процесса получения и управления сертификатами от Let’s Encrypt. Для работы с Nginx Certbot может автоматически обновлять конфигурационные файлы, чтобы настроить HTTPS и редиректы.
Для чего нужен certonly
?
Вы правильно заметили, что вы можете использовать команду certbot certonly
, если планируете создавать и управлять конфигурацией Nginx самостоятельно. Это подход будет особенно полезным, если вы хотите лучше контролировать свои файлы конфигурации и избегать автоматического внесения изменений Certbot. Вы также можете написать свои собственные правила конфигурации без вмешательства Certbot.
Шаги по получению SSL-сертификата с помощью Certbot
-
Установка Certbot: Убедитесь, что Certbot и соответствующий плагин для Nginx установлены. Например, для Ubuntu это можно сделать с помощью команд:
sudo apt update sudo apt install certbot python3-certbot-nginx
-
Запуск Certbot без интерактивного интерфейса: Чтобы получить сертификат в неинтерактивном режиме, используйте следующую команду:
sudo certbot certonly --nginx --agree-tos --email your_email@example.com -d domain.tld -d www.domain.tld --non-interactive
Здесь:
--nginx
— указывает, что используется Nginx.--agree-tos
— вы соглашаетесь с условиями обслуживания Let’s Encrypt.--email your_email@example.com
— ваш адрес электронной почты для получения уведомлений.-d
— домен(ы), для которых вы хотите получить сертификат.--non-interactive
— не требует интерактивного интерфейса.
-
Настройка конфигурации Nginx: После успешного выполнения команды вам нужно будет вручную обновить конфигурацию вашего Nginx. Используйте следующий шаблон, который вы представили, и добавьте его в файл конфигурации вашего сайта:
server { listen 80; server_name domain.tld www.domain.tld; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name domain.tld www.domain.tld; root /var/www/super_site/public; index index.php index.html; access_log /var/log/nginx/super_site_access.log; error_log /var/log/nginx/super_site_error.log; ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; add_header Strict-Transport-Security "max-age=31536000" always; location / { try_files $uri $uri/ /index.php; } location ~ ^/(doc|sql|setup)/ { deny all; } location ~ \.php$ { fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include snippets/fastcgi-php.conf; } location ~ /\.ht { deny all; } }
-
Перезагрузка Nginx: После внесения изменений в конфигурацию перезагрузите Nginx, чтобы применить новые настройки:
sudo systemctl reload nginx
Автоматическое обновление сертификатов
Если вы используете команду certonly
, вам всё равно нужно будет настроить автоматическое обновление сертификатов. Вы можете использовать cron для этой задачи. Добавьте следующую строку в crontab (используя crontab -e
):
0 3 * * * /usr/bin/certbot renew --quiet
Этот кронораз в 3:00 ночи будет проверять и обновлять сертификаты, если они истекают.
Заключение
Использование certonly
действительно даст вам больше контроля над конфигурацией Nginx. Убедитесь, что вы внимательно следите за процессом обновления сертификатов и правильно настраиваете конфигурацию вашего веб-сервера. Ваши шаблоны выглядят отлично и обеспечивают хорошую безопасность. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!