NGINX Certbot настраивает только порт 443 для HTTPS на локальном IP?

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

Я установил NGINX на Ubuntu Server 24.04 без проблем, но возникли проблемы, когда я добавил Certbot, используя эти инструкции. Я пытался решить эту проблему около 2 часов, но мое незнание NGINX оставило меня в тупике.

После того как я успешно использовал их собственную конфигурацию, я заметил, что порт 443 моего веб-сайта дает HTTPS, используя сертификат моего домена на 192.168.1.64 (локальный IP), здорово! Однако, когда я подключаюсь к [мой домашний IP]:443 (тот же сервер был настроен на проброс портов на обоих портах 80 и 443), он выдает HTTP-страницу:

Мой домашний IP выдает HTTP-страницу на порту 443

Когда я подключаюсь, используя свой домен (1232342.xyz), я получаю ошибку Cloudflare, потому что сервер посылает HTTP-страницу через порт 443.

Мой домен отправляет HTTP на порту 443

Файл конфигурации (/etc/nginx/sites-enabled/default) выглядит следующим образом:

##
# Вам следует обратиться к следующим URL, чтобы получить твердоё понимание
# конфигурационных файлов Nginx, чтобы полностью раскрыть потенциал Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# В большинстве случаев администраторы удаляют этот файл из sites-enabled/ и
# оставляют его как справочник внутри sites-available, где он будет
# обновляться командой упаковки nginx.
#
# Этот файл автоматически загружает конфигурационные файлы, предоставленные другими
# приложениями, например, Drupal или WordPress. Эти приложения будут доступны
# под путём с именем этого пакета, например, /drupal8.
#
# Пожалуйста, смотрите /usr/share/doc/nginx-doc/examples/ для более детальных примеров.
##

# Конфигурация сервера по умолчанию
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL конфигурация
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Замечание: Вы должны отключить gzip для трафика SSL.
        # См: https://bugs.debian.org/773332
        #
        # Ознакомьтесь с ssl_ciphers для обеспечения безопасной конфигурации.
        # См: https://bugs.debian.org/765782
        #
        # Не используйте самоподписанные сертификаты, созданные
        # пакетом ssl-cert в производственном сервере!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Добавьте index.php в список, если вы используете PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # Сначала попытайтесь обслужить запрос как файл, затем
                # как директорию, в случае неудачи верните ошибку 404.
                try_files $uri $uri/ =404;
        }

        # передача PHP скриптов на FastCGI сервер
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # С php-fpm (или другими unix сокетами):
        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        #       # С php-cgi (или другими tcp сокетами):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # запрет доступа к .htaccess файлам, если корневая директория Apache
        # совпадает с корневой директорией nginx
        #
        #location ~ /\.ht {
        #       deny all;
        #}
}


# Конфигурация виртуального хоста для example.com
#
# Вы можете перенести это в другой файл под sites-available/ и
# создать ссылку на него в sites-enabled/ чтобы его включить.
#
#server {
#       listen 80;
#       listen [::]:80;
#
#       server_name example.com;
#
#       root /var/www/example.com;
#       index index.html;
#
#       location / {
#               try_files $uri $uri/ =404;
#       }
#}

server {

        # SSL конфигурация
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Замечание: Вы должны отключить gzip для трафика SSL.
        # См: https://bugs.debian.org/773332
        #
        # Ознакомьтесь с ssl_ciphers для обеспечения безопасной конфигурации.
        # См: https://bugs.debian.org/765782
        #
        # Не используйте самоподписанные сертификаты, созданные
        # пакетом ssl-cert в производственном сервере!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Добавьте index.php в список, если вы используете PHP
        index index.html index.htm index.nginx-debian.html;
    server_name 1232342.xyz www.1232342.xyz; # настроено Certbot


        location / {
                # Сначала попытайтесь обслужить запрос как файл, затем
                # как директорию, в случае неудачи верните ошибку 404.
                try_files $uri $uri/ =404;
        }

        # передача PHP скриптов на FastCGI сервер
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # С php-fpm (или другими unix сокетами):
        #       fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        #       # С php-cgi (или другими tcp сокетами):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # запрет доступа к .htaccess файлам, если корневая директория Apache
        # совпадает с корневой директорией nginx
        #
        #location ~ /\.ht {
        #       deny all;
        #}


    listen [::]:443 ssl ipv6only=on; # настроено Certbot
    listen 443 ssl; # настроено Certbot
    ssl_certificate /etc/letsencrypt/live/1232342.xyz/fullchain.pem; # настроено Certbot
    ssl_certificate_key /etc/letsencrypt/live/1232342.xyz/privkey.pem; # настроено Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # настроено Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # настроено Certbot



}
server {
    if ($host = www.1232342.xyz) {
        return 301 https://$host$request_uri;
    } # настроено Certbot


    if ($host = 1232342.xyz) {
        return 301 https://$host$request_uri;
    } # настроено Certbot


        listen 80 ;
        listen [::]:80 ;
    server_name 1232342.xyz www.1232342.xyz;
    return 404; # настроено Certbot
}

Этот файл был автоматически сгенерирован NGINX и Certbot, так что я не понимаю, почему он не работает.

Заранее благодарю за помощь

Ответ или решение

Конфигурация NGINX с использованием Certbot для автоматической настройки SSL может вызвать ряд вопросов, особенно если результат не соответствует ожидаемому. В этом случае пользователь столкнулся с проблемой: локальный IP (192.168.1.64) корректно обслуживает HTTPS-трафик, в то время как при попытке обращения через внешний IP и доменное имя сервер предоставляет HTTP-страницу на порту 443. Давайте подробно разберём возможные причины и решения.

Теория

Основная задача NGINX-сервера и TLS-сертификатов, выданных с помощью Certbot, — обеспечение безопасного соединения между клиентом и сервером. Чтобы это работало, важно правильно сконфигурировать виртуальные хосты (server blocks) в NGINX, а также удостовериться, что сертификационные файлы и конфигурации задействуются во всех необходимых случаях.

Ключевые компоненты конфигурации:

  1. Server Blocks (блоки серверов): Они определяют, как NGINX должен обрабатывать входящие запросы на основе доменного имени и порта. В данном случае, сервер настраивает два блока: один для HTTP (порт 80) и другой для HTTPS (порт 443).

  2. Переадресация (redirect): Обычно, HTTP трафик автоматически перенаправляется на HTTPS, что обеспечивает всегда защищённое соединение.

  3. Настройки SSL: Включают место хранения сертификатов, ключей, и дополнительных параметров безопасности.

Пример

В предоставленной конфигурации видно, что Certbot обработал конфигурацию, добавив необходимые параметры для работы с SSL на домене 1232342.xyz. Конфигурация включает в себя:

  • Команды listen 443 ssl, которые активируют SSL на порту 443.
  • Директивы ssl_certificate и ssl_certificate_key, указывающие на места хранения сертификата и его ключа.
  • Файл include /etc/letsencrypt/options-ssl-nginx.conf, содержащий безопасные SSL-параметры.

Основной вопрос заключается в том, что несмотря на, казалось бы, корректные настройки, внешний доступ и доступ через доменное имя не работают должным образом, возвращая HTTP-контент вместо HTTPS.

Применение

  1. Проверка конфигураций и DNS: Убедитесь, что DNS записи для домена 1232342.xyz правильно направлены на внешний IP-адрес. Проверьте, что таким образом трафик действительно поступает на ваш сервер.

  2. Портфорвардинг: Вы отметили, что порты 80 и 443 были перенаправлены. Тем не менее, убедитесь, что эти перенаправления выполнены корректно, без дополнительных межсетевых экранов или NAT-правил, которые могут препятствовать трафику.

  3. SSL на локальном IP vs внешнем IP: Сертификаты, выпущенные для определённого доменного имени, не будут корректно работать при обращении по IP-адресу. Поэтому важно всегда обращаться по имени домена (в случае внешней сети).

  4. Переадресации и редиректы: Проверьте, что все HTTP-запросы правильно перенаправляются на HTTPS. Это можно делать с помощью директивы return 301 https://$host$request_uri; в блоках HTTP, что уже используется в конфигурации.

  5. Проверка серверных логов: Ошибки конфигурации могут быть диагностированы с помощью логов NGINX. Просмотрите их на предмет ошибок конфигурации или других аномалий, которые могут указывать на проблему.

  6. Обновление и проверка файлов Certbot: Убедитесь, что все сертификаты обновлены и корректно позволяют шифрование.

Заключение

Настройка NGINX с использованием Certbot может выглядеть сложной задачей, но с правильным подходом и проверкой всех аспектов — от DNS настроек до серверных блоков — можно обеспечить надёжную работу вашего веб-сайта. Следуя изложенным шагам, вероятно, вы сможете выявить и устранить непосредственную проблему, сталкиваясь с которой ваш внешний веб-сервер предоставляет странице HTTP вместо HTTPS.

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

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