SSL e Ngnix: nessun "certificato_ssl" è definito nell'ascolto del server sulla porta SSL durante l'handshaking SSL


23

Sono riuscito a creare i miei certificati con LE senza errori, sono anche riuscito a reindirizzare il mio traffico dalla porta 80 alla porta 443. Ma quando ricarico il mio server nginx non riesco ad accedere al mio sito web. I log degli errori di Ngnix mostrano questa riga:

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

Penso che questo significhi che non riesce a trovare i certificati che ho poi navigato nel percorso dei certificati e sono entrambi lì, quale potrebbe essere il problema? Ecco come appare la mia configurazione di 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;
    }

}

Sembra tutto abbastanza semplice, non capisco dove potrebbe essere il problema.

Dopo aver eseguito nginx -t sembra tutto ok:

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

Hai altri serverblocchi? Che cosa hai fatto esattamente quando hai avuto quell'errore?
Tero Kilkanen,

1
L'utente nginx ha accesso al file del certificato e al file chiave? Non è sufficiente avere accesso in lettura ai file, l'utente deve anche avere le autorizzazioni di lettura ed esecuzione per tutte le directory nella catena del file.
Jenny D dice Reinstate Monica il

Risposte:


25

La mia ipotesi è che hai un altro server in ascolto sulla porta 443. Questo server non ha un certificato ssl definito ed è selezionato automaticamente (SNI). Prova a eliminare tutti i collegamenti simbolici da / etc / nginx / sites-enabled tranne questo server che vuoi far funzionare (se possibile, altrimenti controlla tutti i tuoi server per ascoltare 443 senza essere configurato correttamente).


2
BINGO! Nel mio caso, creo il file di configurazione per vhost mail.mydomain, in modo da poter creare un certificato LE per la mia installazione di dovecot e ho dimenticato di aggiungere il file di configurazione.
Marcos Regis,

7

Ho risolto lo stesso problema all'inizio di questa mattina, quindi sono qui per chiarire il punto di CA (che, ora che ho capito il problema, è stato ben fatto), molto probabilmente hai due blocchi di server:

# predefinito
server {
    ascolta 443 default_server; # Nota la mancanza di `ssl`
    nome del server _;
    # ...
}

#real site
server {
    ascolta 443 ssl;
    nome del server ;
    # ...
}

SNI corrisponderà solo a quelli etichettati con un sslascoltatore. Tuttavia, il server predefinito acquisirà tutto il traffico in entrata su 443, indipendentemente da SSL o meno. Quindi, in realtà sta impedendo a SNI di funzionare davvero, subito, accumulando tutto il traffico per sé.

Sintomi:

  • Sembrerà che nginx non stia caricando la tua configurazione (anche con un nginx -te un servizio di ricarica)
  • Errori che indicano "nessun certificato ssl trovato nel blocco server"
  • nginx sta semplicemente applicando il tuo host al listener 443 predefinito.

soluzioni:

Ho risolto il problema questa mattina rimuovendo il blocco del server predefinito, consentendo quindi a SNI di corrispondere ai listener SSL.

Una soluzione alternativa sarebbe quella di aggiungere il ssllistener e le ssl_certificatelinee al blocco del server in modo che SNI sia essenzialmente abilitato sull'host predefinito. Riceverai ancora errori SSL, quindi non è la soluzione migliore, ma consentirà al tuo SNI di funzionare :)


5

È necessario definire un singolo default_serverparametro nella configurazione di nginx.

Fai domanda default_serversu example.com o www.example.com. Non entrambi.

Quindi questo funzionerà:

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

Nota sugli host virtuali: assicurarsi che il default_serverparametro non sia definito altrove - se si hanno più host sul server.


funziona molto bene per me
Josua Marcel Chrisano,

1

In ritardo al gioco come al solito, ma dal momento che mi ha aiutato ... Controlla se il certificato non è valido. Quando si costruisce il crt "unificato" (crt + intermedio), fare

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

Ho in qualche modo perso un LF e ho ottenuto una linea come questa:

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

invece di

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

e nginx non prenderebbe il certificato e fallirebbe con l'errore sopra menzionato.

fare

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

mi ha dato la chiave per openssl sarebbe errore.


-1

Controlla se i permessi dei file per i certificati sono corretti. Si prega di pubblicare l'elenco delle directory ( ls -la)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.