SSL & Ngnix: під час прослуховування сервера на порту SSL при рукостисканні SSL не визначається "ssl_certificate".


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блоки? Що саме ви зробили, коли отримали цю помилку?
Tero Kilkanen

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

Відповіді:


25

Я гадаю, що у вас інший сервер прослуховується на порту 443. У цього сервера не визначено ssl_certificate, і він автоматично вибирається (SNI). Спробуйте видалити всі символічні посилання з / etc / nginx / сайтів, окрім цього, за винятком цього сервера, на якому ви хочете працювати (якщо це можливо, інакше перевірте всі ваші сервери на прослуховування 443, не налаштовані правильно).


2
БІНГО! У моєму випадку я створюю конфігураційний файл для vhost mail.mydomain, тому я можу створити сертифікат LE для моєї установки dovecot і забув додати конфігураційний файл.
Маркос Регіс

7

Цю цю проблему я вирішив раніше цього ранку, тому я тут, щоб уточнити точку CA (яка, як я зрозумів, проблема була добре зроблена), у вас, швидше за все, є два серверні блоки:

# за замовчуванням
сервер {
    прослухати 443 default_server; # Зверніть увагу на відсутність `ssl`
    ім'я_сервера _;
    # ...
}

#real сайт
сервер {
    слухати 443 ssl;
    ім'я сервера;
    # ...
}

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

Симптоми:

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

Рішення:

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

Альтернативним рішенням було б додати sslслухача та ssl_certificateрядки до блоку сервера, щоб SNI по суті був включений у вашому хості за замовчуванням. Ви все одно отримаєте помилки SSL, тому це не найкраще рішення, але це дозволить вашому SNI працювати :)


5

Потрібно визначити один default_serverпараметр у nginx config.

Застосовуйте 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

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

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

Я якось втратив НЧ і отримав такий рядок:

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

замість

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

і nginx не сприймає сертифікат і не спрацьовує з помилкою, згаданою вище.

Робимо

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

дав мені підказку для openssl помилиться.


-1

Перевірте, чи правильні ваші файли для сертифікатів. Будь ласка, опублікуйте список каталогів ( ls -la)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.