SSL и Ngnix: «ssl_certificate» не определен при прослушивании сервером порта SSL во время установления связи SSL

У меня есть удалось создать мои сертификаты с LE без ошибок, мне также удалось перенаправить мой трафик с порта 80 на порт 443. Но когда я перезагружаю свой сервер nginx, я не могу получить доступ к своему веб-сайту. Журналы ошибок Ngnix показывают эту строку:

4 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 192.168.0.104, server: 0.0.0.0:443

Я думаю, это означает, что он не может найти сертификаты, которые я затем перешел по пути сертификатов, и они оба там, в чем может быть проблема? Вот как выглядит моя конфигурация Ngnix:

server {
       listen         80;
       server_name    pumaportal.com www.pumaportal.com;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;

    server_name pumaportal.com www.pumaportal.com;

    add_header Strict-Transport-Security "max-age=31536000";

    ssl_certificate /etc/letsencrypt/live/pumaportal.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pumaportal.com/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    access_log /var/log/nginx/sub.log combined;

    location /.well-known {
       alias /[MY PATH]/.well-known;
    }

    location / {
        proxy_pass http://localhost:2000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

}

Все кажется довольно простым, я не понимаю, в чем может быть проблема.

После запуска nginx -t все выглядит нормально:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
23
задан 12 April 2017 в 19:41
5 ответов

Я предполагаю, что у вас есть другой сервер прослушивание порта 443. Для этого сервера не задан ssl_certificate, и он выбирается автоматически (SNI). Попробуйте удалить все символические ссылки из / etc / nginx / sites-enabled, кроме этого одного сервера, который вы хотите заставить работать (если это возможно, в противном случае проверьте все свои серверы на прослушивание 443 без правильной настройки).

25
ответ дан 28 November 2019 в 20:20

Я исправил ту же проблему сегодня утром, поэтому я здесь, чтобы прояснить точку зрения CA (которая, теперь, когда я понимаю проблему, была хорошо сделана), у вас, скорее всего, есть два серверные блоки:

# default
server {
    listen 443 default_server; # Note the lack of `ssl`
    server_name _;
    #...
}

#real site
server {
    listen 443 ssl;
    server_name ;
    #...
}

SNI будет соответствовать только тем, которые помечены как прослушиватель ssl . Однако сервер по умолчанию будет захватывать весь входящий трафик на 443, независимо от SSL или нет. Следовательно, он фактически не дает SNI вообще работать, сразу с места в карьер, собирая весь трафик для себя.

Симптомы:

  • Похоже, что nginx не загружает вашу конфигурацию (даже с nginx -t и перезагрузка службы)
  • Ошибки с сообщением «в блоке сервера не найден ssl_certificate»
  • nginx просто применяет ваш хост к прослушивателю 443 по умолчанию.

Решения:

Я устранил проблему сегодня утром, удалив блок сервера по умолчанию, что позволило сопоставить SNI с приемниками SSL.

Альтернативным решением было бы добавить прослушиватель ssl и ssl_certificate строки к блоку сервера, чтобы SNI был включен на вашем хосте по умолчанию. Вы по-прежнему будете получать ошибки SSL, так что это не лучшее решение, но оно позволит вашему SNI работать :)

7
ответ дан 28 November 2019 в 20:20

Проверьте правильность прав доступа к файлам для сертификатов. Опубликуйте список каталогов ( ls -la )

-1
ответ дан 28 November 2019 в 20:20

Поздно, как обычно, но поскольку это помогло мне ... Проверьте, не поврежден ли сертификат. При построении "унифицированного" crt (crt + intermediate), выполняя

$cat server.crt provider.intermediate > unified.crt

, я каким-то образом потерял LF и получил такую ​​строку:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

вместо

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

, и nginx не принял сертификат и завершился с указанной ошибкой выше.

Выполнение

# openssl x509 -in unified.cert -text -out

дало мне подсказку, что openssl выйдет из строя.

1
ответ дан 28 November 2019 в 20:20

Вам необходимо определить единственный параметр default_server в конфигурации nginx.

Примените default_server либо на example.com, либо на www.example. com. Не оба.

Следовательно, это будет работать:

server {
    listen 443 ssl;
    listen 80;

    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 80 default_server;

    server_name www.example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 443 ssl default_server;

    server_name www.example.com;
    root /var/www/example.com/public;
    index index.php index.html index.nginx-debian.html;

    ssl on;
    ssl_certificate /etc/ssl/chain.crt;
    ssl_certificate_key /etc/ssl/examplecom.key;

    (rest of your nginx config goes here....)
}

Примечание для виртуальных хостов: убедитесь, что параметр default_server не определен где-либо еще - если у вас есть несколько хостов на сервере.

5
ответ дан 28 November 2019 в 20:20

Теги

Похожие вопросы