Назад | Перейти на главную страницу

Подстановочный знак * .localhost SSL с Nginx и Chrome

Я попытался настроить подстановочный знак *.localhost для HTTP и HTTPS с запросами проксирования Nginx на localhost:3000. DNSmasq используется для разрешения *.localhost к 127.0.0.1.

Для HTTP все работает нормально, но при HTTPS-соединениях в Google Chrome появляется следующая ошибка:

There are issues with the site's certificate chain (net::ERR_CERT_COMMON_NAME_INVALID).

Сертификат представляет собой самозаверяющий сертификат, который я добавил в Chrome через настройки и был создан с помощью следующей команды:

openssl req -x509 -sha256 -newkey rsa:2048 -keyout localhost.key -out localhost.crt -days 3650 -nodes

В Subject как следует:

Subject: C=AU, ST=Western Australia, L=Perth, O=Zephon, CN=*.localhost

Моя конфигурация Nginx выглядит следующим образом:

server {
    listen       80;
    listen       443 ssl; 

    server_name  localhost;

    ssl_certificate /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

    location / {
        proxy_pass          http://localhost:3000;
        proxy_http_version  1.1;
        proxy_set_header    Host             $host;
        proxy_set_header    Upgrade          $http_upgrade;
        proxy_set_header    Connection       "upgrade";
        proxy_set_header    X-Real-IP        $remote_addr;
        proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header    X-Client-Verify  SUCCESS;
        proxy_set_header    X-Client-DN      $ssl_client_s_dn;
        proxy_set_header    X-SSL-Subject    $ssl_client_s_dn;
        proxy_set_header    X-SSL-Issuer     $ssl_client_i_dn;
        proxy_read_timeout 1800;
        proxy_connect_timeout 1800;
    }
}

Итак, в конечном итоге ответ, похоже, заключается в том, что вы просто не можете создать сертификат для *.localhost что Chrome примет.

Мое решение заключалось в том, чтобы перейти на использование *.dev.localhost вместо этого, что сработало.

На самом деле это вполне возможно. То, чего нет, особенно хорошо задокументировано.

https://letsencrypt.org/docs/certificates-for-localhost/#making-and-trusting-your-own-certificates показывает, как сгенерировать собственный сертификат localhost

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
    printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

Затем вы можете решить, какие дополнительные возможности необходимы для подписания подстановочного сертификата. Я считаю, что это так же просто, как предоставить *. префикс (синтаксис подстановочного знака glob) источник

Установка самозаверяющего сертификата задокументирована в другом месте на stackoverlow относительно Linux

Windows IDK, Mac IDC