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


23

Мне удалось создать свои сертификаты с 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

У вас есть другие serverблоки? Что именно вы сделали, когда получили эту ошибку?
Теро Килканен,

1
Имеет ли пользователь nginx доступ к файлу сертификата и файлу ключа? Недостаточно иметь доступ для чтения к файлам, пользователь также должен иметь права на чтение и выполнение для всех каталогов в цепочке к файлу.
Дженни Ди говорит восстановить Монику

Ответы:


25

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


2
БИНГО! В моем случае я создаю файл конфигурации для vhost mail.mydomain, чтобы я мог создать сертификат LE для своей установки dovecot и забыл добавить его в файл конфигурации.
Маркос Регис

7

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

# дефолт
сервер {
    прослушать 443 default_server; # Обратите внимание на отсутствие `ssl`
    имя сервера _;
    # ...
}

# реальный сайт
сервер {
    слушай 443 песни;
    имя сервера ;
    # ...
}

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

Симптомы:

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

Решения:

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

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


5

Вам нужно определить один 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параметр не определен где-либо еще - если у вас есть несколько хостов на сервере.


очень хороший ssl работает на меня
Josua Marcel Chrisano

1

Опаздывает на игру как обычно, но так как она мне помогла ... Проверьте, не поврежден ли сертификат. При построении «унифицированной» ЭЛТ (ЭЛТ + промежуточный), делая

$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.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.