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
;
TLS1 è fondamentalmente solo un'estensione di SSL3.OpenSSL implementa TLS1 all'interno delle sue routine SSL3. –
È 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
mjn, grazie per un suggerimento, non pensaci per qualche motivo – avil