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

23

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 affichent 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
Rémi
la source
Avez-vous d'autres serverblocs? Qu'avez-vous fait exactement quand vous avez eu cette erreur?
Tero Kilkanen du
1
L'utilisateur nginx a-t-il accès au fichier de certificat et au fichier de clé? Il ne suffit pas d'avoir un accès en lecture aux fichiers, l'utilisateur doit également avoir des autorisations de lecture et d'exécution pour tous les répertoires de la chaîne du fichier.
Jenny D dit Reinstate Monica
1
En relation
mbomb007

Réponses:

25

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

CA Vuyk
la source
2
BINGO! Dans mon cas, je crée un fichier de configuration pour vhost mail.mydomain, donc je peux créer un certificat LE pour mon installation de pigeonnier et j'ai oublié d'ajouter sur le fichier de configuration.
Marcos Regis
7

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

# défaut
serveur {
    écouter 443 default_server; # Notez le manque de `ssl`
    nom du serveur _;
    # ...
}

# site réel
serveur {
    écouter 443 ssl;
    nom du serveur ;
    # ...
}

SNI ne correspondra qu'à ceux qui sont étiquetés avec un sslécouteur. 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 -tet 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 solution alternative serait d'ajouter l' sslécouteur et les ssl_certificatelignes au 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 :)

Révérend Tim
la source
5

Vous devez définir un seul default_serverparamètre dans la configuration nginx.

Postulez default_serversur 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 default_serverparamètre n'est défini nulle part ailleurs - si vous avez plusieurs hôtes sur le serveur.

ingo
la source
très belle ssl sur fonctionne pour moi
Josua Marcel Chrisano
1

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.

cucu8
la source
-1

Vérifiez si vos autorisations de fichier pour les certificats sont correctes. Veuillez afficher la liste du répertoire ( ls -la)

sridhar pandurangiah
la source