web-dev-qa-db-fra.com

Comment dépanner l'échec de la négociation SSL Nginx?

J'essaie de configurer HTTPS pour nginx sur Ubuntu 16.04. Je l'ai déjà configuré avec listen 443 ssl, et lui a indiqué où trouver le certificat et les fichiers de clé privée. Après cela, j'ai redémarré le serveur avec Sudo service nginx restart.

Maintenant, quand je curl https://my_ip_address, J'obtiens le message suivant:

curl: (35) gnutls_handshake() failed: Handshake failed

J'ai vérifié les deux fichiers journaux que je connais, /var/log/nginx/access.log et /var/log/nginx/error.log; mais il ne montre aucune trace de quoi que ce soit de la demande.

Ma question: est-ce que quelque chose est enregistré lorsque la prise de contact SSL échoue? Si oui, où? En général, comment résoudre des problèmes comme celui-ci, où il y a une erreur dans le protocole SSL avant que la requête HTTP ne soit envoyée ou extraite par le serveur?

EDIT: Je l'ai fait fonctionner en supprimant les lignes suivantes de ma configuration:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Mise à jour: le ssl_ecdh_curve secp384r1; line semble être à l'origine du problème. Sans elle, tout fonctionne bien, mais avec elle, la prise de contact SSL échoue. Curieusement, le message d'erreur est qu'il n'y a "pas de chiffre partagé". Je ne suis pas sûr de ce qu'il fait, alors je l'ai juste retiré. J'ai également supprimé le truc ssl_stapling parce que je ne sais pas à quoi il sert, et il créait ses propres messages d'erreur

7
Michael Hewson

Comme l'a dit @Paul, la solution était d'augmenter le niveau de journalisation. J'ai changé une ligne dans mon nginx.conf fichier, il se lit maintenant comme suit:

error_log  /var/log/nginx/error.log debug;

Et maintenant que le niveau de journalisation est plus élevé, il enregistre les erreurs de prise de contact SSL:

2016/09/19 22:38:08 [info] 10114#10114: *2 SSL_do_handshake() failed (SSL: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher) while SSL handshaking, client: 108.162.242.24, server: 0.0.0.0:443
7
Michael Hewson

En fait, vous avez utilisé l'option ssl_ecdh_curve pour configurer échange de clés Diffie Hellman dans Nginx mais vous n'avez pas fourni de fichier de paramètres. Par conséquent, vous devez utiliser l'option ssl_dhparam et devez créer un fichier avec openssl.

Créer un fichier:

openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Utilisez le fichier et la configuration Diffie Hellman ci-dessus dans Nginx:

ssl_dhparam                     /etc/ssl/certs/dhparam.pem;
ssl_ecdh_curve                  secp384r1;
4
Jens Bradler

Vous pouvez vérifier votre configuration de serveur nginx, il y a une ligne de configuration est: ssl_ciphers, la valeur par défaut est: ssl_ciphers HIGH:! ANULL:! MD5; ( http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers ), mais parfois n'est pas prévu, dans mon cas, la valeur par défaut de nginx-ingress-controller est inférieure à la configuration par défaut et l'erreur d'affichage du journal de débogage nginx est: pas de chiffrement partagé. lorsque j'ajoute des chiffres dans le fichier de configuration et que je recharge nginx, le préambule a été supprimé. Et vous pouvez référencer ce modèle de configuration: https://mozilla.github.io/server-side-tls/ssl-config-generator /

0
user8292879