web-dev-qa-db-fra.com

SSL et Nginx: aucun "ssl_certificate" n'est défini dans l'écoute du serveur sur le port SSL pendant la négociation SSL

J'ai réussi à créer mes certificats avec LE sans erreurs, j'ai également réussi à rediriger mon trafic du port 80 vers le port 443. Mais lorsque je recharge mon serveur nginx, je ne peux pas accéder à mon site Web. Les journaux d'erreurs Ngnix montrent cette ligne:

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

Je pense que cela signifie qu'il ne peut pas trouver les certificats que j'ai ensuite parcourus vers le chemin des certificats et qu'ils sont tous les deux là, quel pourrait être le problème? Voici à quoi ressemble ma configuration 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;
    }

}

Tout semble assez simple, je ne comprends pas où pourrait être le problème.

Après avoir exécuté nginx -t, tout semble correct:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
27
Rémi

Je suppose que vous avez un autre serveur à l'écoute sur le port 443. Ce serveur n'a pas de ssl_certificate défini, et il est automatiquement sélectionné (SNI). Essayez de supprimer tous les liens symboliques de/etc/nginx/sites-enabled sauf celui-ci que vous souhaitez faire fonctionner (si c'est possible, sinon vérifiez tous vos serveurs pour écouter 443 sans être configuré correctement).

29
C.A. Vuyk

J'ai corrigé ce même problème plus tôt ce matin, donc je suis ici pour clarifier le point de C.A (qui, maintenant que je comprends le problème, était bien fait), vous avez probablement deux blocs de serveur:

# par défaut 
 serveur {
 écouter 443 default_server; # Notez l'absence de `ssl` 
 Nom_serveur _; 
 # ... 
} 
 
 # Serveur du site réel 
 {
 écouter 443 ssl; 
 nom_serveur; 
 # ... 
} 

SNI niquement correspondra à ceux qui sont étiquetés avec un écouteur ssl. Cependant, le serveur par défaut récupérera tout le trafic entrant sur 443, indépendamment de SSL ou non. Par conséquent, cela empêche en fait la SNI de fonctionner, dès le départ, en accumulant tout le trafic pour elle-même.

Symptômes:

  • Il semblerait que nginx ne charge pas votre configuration (même avec un nginx -t et un rechargement de service)
  • Erreurs indiquant "aucun ssl_certificate trouvé dans le bloc serveur"
  • nginx applique simplement votre hôte à l'écouteur 443 par défaut.

Solutions:

J'ai résolu le problème ce matin en supprimant le bloc serveur par défaut, permettant ainsi à SNI de correspondre sur les écouteurs SSL.

Une autre solution serait d'ajouter l'écouteur ssl et le ssl_certificate lignes vers le bloc serveur afin que SNI soit essentiellement activé sur votre hôte par défaut. Vous obtiendrez toujours des erreurs SSL, ce n'est donc pas la meilleure solution, mais cela permettra à votre SNI de fonctionner :)

9
Reverend Tim

Vous devez définir un seul paramètre default_server Dans la configuration nginx.

Appliquez default_server Sur example.com ou www.example.com. Pas les deux.

Par conséquent, cela fonctionnera:

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

Remarque sur les hôtes virtuels: assurez-vous que le paramètre default_server N'est défini nulle part ailleurs - si vous avez plusieurs hôtes sur le serveur.

5
ingo

Tard dans le jeu comme d'habitude, mais puisque cela m'a aidé ... Vérifiez si le certificat est mal formé. Lors de la construction du crt "unifié" (crt + intermédiaire), faire

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

J'ai en quelque sorte perdu un LF et j'ai obtenu une ligne comme celle-ci:

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

au lieu de

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

et nginx ne prendrait pas le certificat et échouerait avec l'erreur mentionnée ci-dessus.

Faire

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

m'a donné la clé pour openssl serait une erreur.

1
cucu8