2015-09-30 9 views
5

codice semplice:tidhttp: strano errore SSLv3_READ_BYTES (con direttamente impostare la connessione TLSv1_2)

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; 

Questo semplice codice mi dà un errore:

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

Io uso Delphi XE3 e OpenSSL 1.0.2b librerie. Non riesco a capirlo, guardando in fonti, non v'è stringhe in iniziazione connessione non disable utilizzate versioni:

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; 

ma le operazioni SSLv3 ancora ottenere in qualche modo. Non sembra un bug di un componente. Qualcosa di libreria interna, o indy non considera qualcosa quando si impostano i parametri?

O in realtà sono io, che non ha notato qualcosa di importante? Spero davvero che non sia necessario passare attraverso un inferno chiamato "aggiornamento dei componenti di indy".

Test (provato tutti i metodi compresi 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 
  • per SSL3 e TLS1/1.1/1.2 risultato è identico;
  • per SSLv23 risposte SSL23_GET_SERVER_HELLO: errore di handshake di avviso sslv3;
  • per SSLv2 non risponde;

test sulla risorsa simile (TLS1.2 SOLO) 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 

miei test Wireshark:

  • Indy: http://imgur.com/BZ84Cl3 (risposta è mancata stretta di mano);
  • Firefox: http://imgur.com/pkYJvnO;
  • Risposta a richiesta di Firefox: http://imgur.com/M9ni3TV;
+0

TLS1 è fondamentalmente solo un'estensione di SSL3.OpenSSL implementa TLS1 all'interno delle sue routine SSL3. –

+0

È possibile provare facilmente le versioni più recenti di Indy aggiungendo le directory di origine Indy al percorso di ricerca del progetto e creando il componente in modo dinamico. Vedi anche: [TIdHTTP ora crea un SSLIOHandler predefinito quando richiede un URL HTTPS] (http://www.indyproject.org/Sockets/Blogs/ChangeLog/20141222.DE.aspx) – mjn

+0

mjn, grazie per un suggerimento, non pensaci per qualche motivo – avil

risposta

0

mancato avviso di handshake significa l'handshake iniziale sta venendo a mancare sul lato server, quindi invia un avviso per informare il cliente prima di allora di chiudere la connessione. Probabilmente non hai impostato un certificato compatibile o una suite di crittografia che il server si aspetta. O forse il server semplicemente non supporta TLS 1.2. Prova invece a utilizzare TLS 1.0 o TLS 1.1. Inoltre, puoi provare a utilizzare lo strumento s_client di OpenSSL per eseguire il debug dei problemi di connessione fino a quando non trovi le impostazioni corrette, quindi applicale a Indy secondo necessità. Oppure, usa Wireshark per guardare l'effettiva stretta di mano e vedere in quale fase sta fallendo.

+0

Ti sento. Ho provato anche tutti i metodi accessibili. E anche il mio browser usa decisamente la crittografia TLS 1.2 per questo (secondo i dati di sicurezza di una pagina). C'è un'altra risorsa con una base simile (file server, non ui one): https://files.yande.re/image/da9afa6d9ca43a9f154fad69f76adb85.jpg Ha smesso di funzionare dopo l'avvio del panico barboncino, ma un aggiornamento su OpenSSL lib ha aiutato con esso. Non con deviantart, tho. In base ai dati del mio browser, utilizza lo stesso metodo di crittografia per entrambe le risorse. Quindi, penso che dovrei guardare in cifre in un momento. – avil

0

Ho risolto un problema di stretta di mano questa mattina, confrontando i log di wireshark di google chrome (che ha funzionato bene) e la mia applicazione (con problemi di handshake). Si è scoperto che dovevo abilitare l'estensione "signature_algorithms".

Tuttavia, uso SecureBlackBox (e non indy e openssl) perché ho dovuto caricare dinamicamente un certificato client, ma forse questo può aiutarti (confronta e fai il debug con wireshark!).

+0

Ahimè, non è il mio caso. Indy utilizza signature_algorithms, contrassegnando tutte le firme in esso contenute (da SHA1 + RSA/DSA/ECDSA a SHA512). Cercando di capire se un altro interno può causare un problema (come l'estensione di heartbeat utilizzata nelle richieste di indy, ma non nel browser), o qualcosa che manca. Farà molta fatica a giocare con le flag DLL T_T. L'elenco di cifrari è identico a un browser ATM. – avil

Problemi correlati