2015-09-30 8 views
5

Einfach Code:tidhttp: weird SSLv3_READ_BYTES Fehler (einrichten direkt TLSv1_2 Verbindung)

procedure TForm1.Button1Click(Sender: TObject); 
    //var 
    //h: tIdHTTP; 
    //SSL: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    h.IOHandler := SSL; 
    SSL.SSLOptions.Method := sslvTLSv1_2; 
    SSL.SLLOptions.SSLVersion := [sslvTLSv1_2]; //must be set automatically after SetMethod, but just to be sure 
    h.Get('https://www.deviantart.com/users/login'); 
end; 

Das einfache Code gibt mir eine Fehlermeldung:

Error connecting with SSL.
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

Ich benutze Delphi XE3 und OpenSSL 1.0.2b Bibliotheken. Ich kann es nicht herausgefunden, untersuchend Quellen gibt es Strings in Verbindung Einleitung, die Versionen nicht verwendet deaktivieren:

if not (sslvSSLv2 in SSLVersions) then begin 
    SSL_CTX_set_options(fContext, SSL_OP_NO_SSLv2); 
end; 
if not (sslvSSLv3 in SSLVersions) then begin 
    SSL_CTX_set_options(fContext, SSL_OP_NO_SSLv3); 
end; 
if not (sslvTLSv1 in SSLVersions) then begin 
    SSL_CTX_set_options(fContext, SSL_OP_NO_TLSv1); 
end; 

Aber SSLv3- Operationen noch in irgendwie zu bekommen. Sieht nicht wie der Fehler einer Komponente aus. Etwas Bibliothek intern oder Indy berücksichtigt nicht etwas beim Einrichten von Parametern?

Oder ist es eigentlich ich, der nichts Wichtiges bemerkt hat? Ich hoffe wirklich, dass ich nicht durch eine Hölle namens "Indy Components Update" gehen muss.

-Test auf (versucht, alle Verfahren, einschließlich TLS1.2) https://www.deviantart.com/users/login

Resolving hostname www.deviantart.com. 
Connecting to 54.230.96.81. 
Handshake Start: before/connect initialization 
Connect Loop: before/connect initialization 
Connect Loop: SSLv3 write client hello A 
fatal Read Alert: handshake failure 
Connect Failed: SSLv3 read server hello A 
ERROR: Error connecting with SSL. 
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure 
  • für SSL3 und TLS1/1.1/1.2 Ergebnis ist identisch;
  • für SSLv23-Antworten SSL23_GET_SERVER_HELLO: sslv3-Alert-Handshake-Fehler;
  • für SSLv2 antwortet nicht;

-Test auf ähnliche Ressource (TLS1.2 ONLY) https://files.yande.re/image/da9afa6d9ca43a9f154fad69f76adb85.jpg

Resolving hostname files.yande.re. 
Connecting to 5.39.10.56. 
Handshake Start: before/connect initialization 
Connect Loop: before/connect initialization 
Connect Loop: SSLv3 write client hello A 
Connect Loop: SSLv3 read server hello A 
Connect Loop: SSLv3 read server certificate A 
Connect Loop: SSLv3 read server key exchange A 
Connect Loop: SSLv3 read server done A 
Connect Loop: SSLv3 write client key exchange A 
Connect Loop: SSLv3 write change cipher spec A 
Connect Loop: SSLv3 write finished A 
Connect Loop: SSLv3 flush data 
Connect Loop: SSLv3 read server session ticket A 
Connect Loop: SSLv3 read finished A 
Handshake Done: SSL negotiation finished successfully 
Connect Exit: SSL negotiation finished successfully 

Meine Wireshark-Tests:

  • Indy: http://imgur.com/BZ84Cl3 (Antwort Handshake-Fehler ist);
  • Firefox: http://imgur.com/pkYJvnO;
  • Antwort auf Firefox-Anfrage: http://imgur.com/M9ni3TV;
+0

TLS1 ist im Grunde nur eine Erweiterung von SSL3.OpenSSL implementiert TLS1 innerhalb seiner SSL3-Routinen. –

+0

Sie können einfach neuere Versionen von Indy ausprobieren, wenn Sie die Indy-Quellenverzeichnisse zum Projektsuchpfad hinzufügen und die Komponente dynamisch erstellen. Siehe auch: [TIdHTTP erstellt jetzt einen Standard-SSLIOHandler beim Anfordern einer HTTPS-URL] (http://www.indyproject.org/Sockets/Blogs/ChangeLog/20141222.DE.aspx) – mjn

+0

mjn, danke für einen Tipp, nicht Denken Sie darüber nach, aus irgendeinem Grund. – avil

Antwort

0

Alarm Handshake-Fehler bedeutet der anfängliche Handshake auf der Server-Seite versagt, so sendet er eine Benachrichtigung Ihrer Kunden zu benachrichtigen, bevor dann die Verbindung geschlossen wird. Wahrscheinlich haben Sie kein kompatibles Zertifikat oder eine Verschlüsselungssuite eingerichtet, die der Server erwartet. Oder vielleicht unterstützt der Server TLS 1.2 einfach nicht. Versuchen Sie stattdessen, TLS 1.0 oder TLS 1.1 zu verwenden. Sie können auch versuchen, das OpenSSL-eigene Tool s_client zu verwenden, um Verbindungsprobleme zu beheben, bis Sie die richtigen Einstellungen herausgefunden haben, und sie dann nach Bedarf auf Indy anwenden. Oder verwenden Sie Wireshark, um den tatsächlichen Handshake zu betrachten und zu sehen, in welchem ​​Stadium es versagt.

+0

Ich höre dich. Ofc Ich habe auch jede zugängliche Methode ausprobiert. Und auch mein Browser verwendet definitiv TLS 1.2-Verschlüsselung dafür (gemäß einer Seite Sicherheitsdaten). Es gibt eine andere Ressource mit einer ähnlichen Basis (Dateiserver, nicht ui eins): https://files.yande.re/image/da9afa6d9ca43a9f154fad69f76adb85.jpg Es funktioniert nicht mehr, nachdem Pudel Panik begann, aber ein Update auf OpenSSL lib half damit. Nicht mit deviantart, tho. Basierend auf den Daten meines Browsers verwendet er die gleiche Verschlüsselungsmethode für beide Ressourcen. Also, ich denke, ich sollte in einem Moment in die Chiffren schauen. – avil

0

Ich habe heute morgen ein Handshake-Problem behoben, indem ich die Wireshark-Logs von Google Chrome (was gut funktioniert) und meine Anwendung (mit Handshake-Problemen) verglichen habe. Es stellte sich heraus, dass ich die Erweiterung "signature_algorithms" aktivieren musste.

Allerdings verwende ich SecureBlackBox (und nicht Indy und OpenSSL), weil ich ein Client-Zertifikat dynamisch laden musste, aber vielleicht kann dies Ihnen helfen (vergleichen und debuggen Sie es mit Wireshark!).

+0

Leider ist es nicht mein Fall. Indy verwendet signature_algorithms, markiert alle Signaturen (von SHA1 + RSA/DSA/ECDSA bis SHA512). Versuchen herauszufinden, ob eine andere Erweiterung ein Problem verursachen kann (wie die Heartbeat-Erweiterung, die in den Anfragen von Indy verwendet wird, aber nicht im Browser), oder etwas fehlt. Es wird eine Menge Schmerz sein, wenn man mit DLL Flags T_T spielt. Die Cipher-Liste ist identisch mit einem Browser-ATM. – avil