Нужен совет по использованию Certbot с Nginx для SSL-сертификатов

Вопрос или проблема

Мне нужен совет о том, как правильно использовать 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

  1. Установка Certbot: Убедитесь, что Certbot и соответствующий плагин для Nginx установлены. Например, для Ubuntu это можно сделать с помощью команд:

    sudo apt update
    sudo apt install certbot python3-certbot-nginx
  2. Запуск 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 — не требует интерактивного интерфейса.
  3. Настройка конфигурации 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;
       }
    }
  4. Перезагрузка Nginx: После внесения изменений в конфигурацию перезагрузите Nginx, чтобы применить новые настройки:

    sudo systemctl reload nginx

Автоматическое обновление сертификатов

Если вы используете команду certonly, вам всё равно нужно будет настроить автоматическое обновление сертификатов. Вы можете использовать cron для этой задачи. Добавьте следующую строку в crontab (используя crontab -e):

0 3 * * * /usr/bin/certbot renew --quiet

Этот кронораз в 3:00 ночи будет проверять и обновлять сертификаты, если они истекают.

Заключение

Использование certonly действительно даст вам больше контроля над конфигурацией Nginx. Убедитесь, что вы внимательно следите за процессом обновления сертификатов и правильно настраиваете конфигурацию вашего веб-сервера. Ваши шаблоны выглядят отлично и обеспечивают хорошую безопасность. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...