Wie kann ich einen Nginx SSL-Handshake-Fehler beheben?

8

Ich versuche, HTTPS für nginx unter Ubuntu 16.04 zu konfigurieren. Ich habe es bereits mit listen 443 sslAnweisungen eingerichtet und ihm mitgeteilt, wo sich das Zertifikat und die privaten Schlüsseldateien befinden. Danach habe ich den Server mit neu gestartet sudo service nginx restart.

Wenn ich jetzt bin curl https://my_ip_address, erhalte ich die folgende Nachricht:

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

Ich habe die zwei Protokolldateien überprüft ich kenne, /var/log/nginx/access.logund /var/log/nginx/error.log; Es wird jedoch keine Spur von der Anfrage angezeigt.

Meine Frage: Wird etwas protokolliert, wenn der SSL-Handshake fehlschlägt? Wenn ja wo? Wie kann ich im Allgemeinen solche Probleme beheben, bei denen ein Fehler im SSL-Protokoll vorliegt, bevor die HTTP-Anforderung an den Server gesendet oder vom Server extrahiert wird?

EDIT: Ich habe es zum Laufen gebracht, indem ich die folgenden Zeilen aus meiner Konfiguration entfernt habe:

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;

Update: Die ssl_ecdh_curve secp384r1;Leitung schien das Problem zu verursachen. Ohne das funktioniert alles gut, aber damit schlägt der SSL-Handshake fehl. Seltsamerweise lautet die Fehlermeldung, dass "keine gemeinsame Chiffre" vorhanden ist. Ich bin mir nicht sicher, was es tut, also habe ich es einfach entfernt. Ich habe auch das ssl_stapling-Zeug entfernt, weil ich nicht weiß, wofür es ist, und es hat seine eigenen Fehlermeldungen erstellt

Michael Hewson
quelle
Vielleicht würde eine ausführlichere Protokolleinstellung funktionieren. Siehe nginx-Kernmodul error_log . Es kann jedoch sein, dass etwas anderes mit Ihrer Konfiguration nicht stimmt, indem Sie einfach sudo nginx -tdie relevanten Teile der Konfiguration in Ihrer Frage veröffentlichen, um weitere Hilfe zu erhalten.
Paul
1
Ich habe vergessen zu erwähnen, dass es im Allgemeinen eine gute Idee ist, dies zu überprüfen, /var/log/syslogda Sie möglicherweise andere Probleme identifizieren, die jedoch nicht unbedingt mit diesem zusammenhängen.
Paul
error_log wurde bereits auf gesetzt warnund ich habe es geändert alert, aber immer noch nichts. Könnte der Fehler in openssl auftreten, bevor die Anforderung nginx erreicht?
Michael Hewson
und nichts taucht in meinem auf syslog, außer ein paar UFW-Blöcken, die nichts miteinander zu tun zu haben scheinen
Michael Hewson
1
Mein Verständnis ist, dass Sie zur Erhöhung der Ausführlichkeit in die andere Richtung gehen würden. Zum Beispiel debugwäre am ausführlichsten. Damit ich erraten kann, was los ist, müsste ich die relevanten Teile der Konfiguration sehen. Andere können vielleicht ohne diagnostizieren, aber ich bin nicht ganz so erfahren.
Paul

Antworten:

8

Wie @Paul sagte, bestand die Lösung darin, die Protokollstufe zu erhöhen. Ich habe eine Zeile in meiner nginx.confDatei geändert und sie lautet nun wie folgt:

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

Und jetzt, da die Protokollstufe höher ist, werden SSL-Handshake-Fehler protokolliert:

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
Michael Hewson
quelle
4
Wie die [info]Überschrift zeigt, wäre eine Protokollinformationsebene ausreichend und viel lauter als das Debuggen.
Michael Hampton
@MichaelHampton aus irgendeinem Grund unterscheidet sich mein Protokoll (im Grunde identisch mit dem in diesem Beitrag) darin, dass es nur von [debug]und nicht protokolliert wird [info]. Für einige ist es daher möglicherweise besser, mit der ausführlichsten Protokollierung zu beginnen.
Marc
4

Eigentlich haben Sie die Option ssl_ecdh_curve verwendet , um den Diffie Hellman-Schlüsselaustausch in Nginx zu konfigurieren, aber Sie haben keine Parameterdatei angegeben. Daher müssen Sie die Option ssl_dhparam verwenden und eine Datei mit openssl erstellen.

Erstelle Datei:

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

Verwenden Sie die Diffie Hellman-Konfiguration für Dateien und höher in Nginx:

ssl_dhparam                     /etc/ssl/certs/dhparam.pem;
ssl_ecdh_curve                  secp384r1;
Jens Bradler
quelle
Ich habe meine eigene Antwort akzeptiert, weil sie die ursprüngliche Frage beantwortet, Ihnen aber trotzdem +1 gegeben, um darauf hinzuweisen. Nur um zu beachten, ich hatte tatsächlich eine ssl_dhparamin der Konfigurationsdatei, aber irgendwie landete sie nicht in dem Code, den ich gepostet habe.
Michael Hewson
0

Sie können die Konfiguration Ihres Nginx-Servers überprüfen. Es gibt eine Konfigurationszeile: ssl_ciphers, der Standardwert ist: ssl_ciphers HIGH :! ANULL :! MD5; ( http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers ), aber manchmal ist in meinem Fall nicht zu erwarten, dass der Standardwert für nginx-ingress-controller geringer ist als die Standardkonfiguration, und das Nginx-Debug-Protokoll wird angezeigt Fehler ist: keine gemeinsame Chiffre. Wenn ich einige Chiffren in die Konfigurationsdatei einfüge und nginx neu lade, wurde das Promeble verschoben. Und Sie können auf diese Konfigurationsvorlage verweisen: https://mozilla.github.io/server-side-tls/ssl-config-generator/

user8292879
quelle