SSL & Ngnix: tidak ada "ssl_certificate" didefinisikan dalam server mendengarkan pada port SSL saat handshaking SSL


23

Saya telah berhasil membuat sertifikat saya dengan LE tanpa kesalahan, saya juga berhasil mengarahkan lalu lintas dari port 80 ke port 443. Tetapi ketika saya memuat ulang server nginx saya, saya tidak dapat mengakses situs web saya. Log kesalahan Ngnix menunjukkan baris ini:

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

Saya pikir ini berarti bahwa ia tidak dapat menemukan sertifikat yang kemudian saya navigasikan ke jalur sertifikat dan keduanya ada di sana, apa masalahnya? Berikut ini tampilan konfigurasi Ngnix saya:

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;
    }

}

Semua itu kelihatannya cukup jelas. Saya tidak mengerti di mana masalahnya.

Setelah menjalankan nginx -t semuanya tampak ok:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Apakah Anda memiliki serverblok lain ? Apa sebenarnya yang Anda lakukan ketika Anda mendapatkan kesalahan itu?
Tero Kilkanen

1
Apakah pengguna nginx memiliki akses ke file sertifikat dan file kunci? Tidak cukup memiliki akses baca ke file, pengguna juga perlu membaca dan menjalankan izin untuk semua direktori dalam rantai ke file.
Jenny D mengatakan Reinstate Monica

Jawaban:


25

Dugaan saya adalah Anda memiliki server lain yang mendengarkan pada port 443. Server ini tidak memiliki ssl_certificate yang ditentukan, dan itu dipilih secara otomatis (SNI). Cobalah untuk menghapus semua tautan simbolis dari / etc / nginx / sites-enabled kecuali server yang ingin Anda gunakan ini berfungsi (jika itu memungkinkan, periksa semua server Anda untuk mendengarkan 443 tanpa terkonfigurasi dengan benar).


2
BINGO! Dalam kasus saya, saya membuat file config untuk vhost mail.mydomain, jadi saya bisa membuat sertifikat LE untuk instalasi dovecot saya dan lupa menambahkan file config.
Marcos Regis

7

Saya memperbaiki masalah yang sama tadi pagi ini, jadi saya di sini untuk mengklarifikasi poin CA (yang, sekarang saya mengerti masalahnya, dibuat dengan baik), Anda kemungkinan besar memiliki dua blok server:

# default
server {
    dengarkan 443 default_server; # Catat kurangnya `ssl`
    nama server _;
    # ...
}

Situs #real
server {
    dengarkan 443 ssl;
    nama server ;
    # ...
}

SNI hanya akan cocok dengan yang berlabel sslpendengar. Namun, server default akan mengambil semua lalu lintas masuk pada 443, terlepas dari SSL atau tidak. Oleh karena itu, sebenarnya preveting SNI dari benar-benar berfungsi sama sekali, langsung dari kelelawar, dengan menimbun semua lalu lintas untuk dirinya sendiri.

Gejala:

  • Tampaknya nginx tidak memuat konfigurasi Anda (bahkan dengan nginx -tdan layanan yang dimuat ulang)
  • Galat yang menyatakan "tidak ditemukan ssl_certificate di blok server"
  • nginx hanya menerapkan host Anda ke 443 pendengar default.

Solusi:

Saya memperbaiki masalah pagi ini dengan menghapus blok server default, sehingga memungkinkan SNI untuk mencocokkan pada pendengar SSL.

Solusi alternatif adalah dengan menambahkan sslpendengar dan ssl_certificategaris ke blok server sehingga SNI pada dasarnya diaktifkan pada host default Anda. Anda masih akan mendapatkan kesalahan SSL, jadi itu bukan solusi terbaik, tetapi ini akan membuat SNI Anda berfungsi :)


5

Anda perlu mendefinisikan satu default_serverparameter dalam konfigurasi nginx.

Terapkan default_serverdi example.com atau www.example.com. Tidak keduanya.

Maka ini akan bekerja:

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....)
}

Catatan tentang host virtual: Pastikan default_serverparameter tidak ditentukan di tempat lain - jika Anda memiliki beberapa host di server.


ssl yang sangat bagus berfungsi untuk saya
Josua Marcel Chrisano

1

Terlambat ke permainan seperti biasa, tetapi karena itu membantu saya ... Periksa apakah sertifikat salah. Ketika membangun crt "unified" (crt + perantara), lakukan

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

Saya entah bagaimana kehilangan LF dan mendapat garis seperti ini:

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

dari pada

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

dan nginx tidak akan mengambil sertifikat dan gagal dengan kesalahan yang disebutkan di atas.

Perbuatan

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

memberi saya petunjuk untuk openssl akan kesalahan keluar.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.