Prosty kod:tidhttp: dziwne SSLv3_READ_BYTES błędu (z bezpośrednio skonfigurować połączenie 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;
To prosty kod daje mi błąd:
Error connecting with SSL.
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
używam Delphi XE3 i OpenSSL 1.0.2b libs. nie mogę zrozumieć to, patrząc źródeł, istnieje ciągi w inicjacji połączenia, które nie wyłączają używanych wersjach:
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;
Ale operacje SSLv3 wciąż się w jakiś sposób. Nie wygląda jak błąd komponentu. Coś biblioteki wewnętrznej lub indy nie bierze pod uwagę czegoś podczas ustawiania parametrów?
Czy to właściwie ja, który nie zauważyłem czegoś ważnego? Naprawdę mam nadzieję, że nie muszę przechodzić przez piekło o nazwie "aktualizacja składników indyka".
Test (wypróbowaniu wszystkich metod, w tym 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
- do SSL3 i TLS1/1,1/1,2 wynik jest identyczny;
- dla odpowiedzi SSLv23 SSL23_GET_SERVER_HELLO: niepowodzenie uzgadniania alertu sslv3;
- dla SSLv2 nie odpowiada;
Test podobnego zasobu (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
moich testów Wireshark:
- Indy:
http://imgur.com/BZ84Cl3
(odpowiedź jest awaria handshake); - Firefox:
http://imgur.com/pkYJvnO
; - Odpowiedź na prośbę Firefoksa:
http://imgur.com/M9ni3TV
;
TLS1 jest po prostu rozszerzeniem SSL3.OpenSSL implementuje protokół TLS1 w swoich procedurach SSL3. –
Możesz łatwo wypróbować nowsze wersje Indy, jeśli dodasz katalogi źródłowe Indy do ścieżki wyszukiwania projektu i dynamicznie utworzysz komponent. Zobacz także: [TIdHTTP tworzy teraz domyślny SSLIOHandler podczas żądania URL-a HTTPS] (http://www.indyproject.org/Sockets/Blogs/ChangeLog/20141222.DE.aspx) – mjn
mjn, dzięki za wskazówkę, nie pomyśl o tym z jakiegoś powodu. – avil