2015-09-30 43 views
5

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;
+0

TLS1 jest po prostu rozszerzeniem SSL3.OpenSSL implementuje protokół TLS1 w swoich procedurach SSL3. –

+0

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

+0

mjn, dzięki za wskazówkę, nie pomyśl o tym z jakiegoś powodu. – avil

Odpowiedz

0

alert handshake awaria oznacza początkowy handshake zawodzi po stronie serwera, więc wysyła ostrzeżenie do poinformowania klienta przed następnie zamknięcie połączenia. Prawdopodobnie nie zainstalowano zgodnego certyfikatu lub zestawu algorytmów szyfrowania oczekiwanego przez serwer. A może serwer po prostu nie obsługuje TLS 1.2. Zamiast tego spróbuj użyć TLS 1.0 lub TLS 1.1. Możesz także spróbować użyć narzędzia OpenSSL s_client do debugowania problemów z połączeniem do momentu wykrycia poprawnych ustawień, a następnie zastosować je do Indy w razie potrzeby. Lub użyj Wiresharka, aby spojrzeć na faktyczny uścisk ręki i zobaczyć, na którym etapie się nie udaje.

+0

Słyszę cię. Ofc wypróbowałem też każdą dostępną metodę. A także moja przeglądarka zdecydowanie używająca szyfrowania TLS 1.2 (zgodnie z danymi bezpieczeństwa strony). Istnieje inny zasób o podobnej podstawie (serwer plików, nie ui): https://files.yande.re/image/da9afa6d9ca43a9f154fad69f76adb85.jpg Przestał działać po rozpoczęciu paniki pudla, ale aktualizacja biblioteki OpenSSL pomogła z tym. Nie z deviantartem, tho. Na podstawie danych mojej przeglądarki korzysta z tej samej metody szyfrowania dla obu zasobów. Myślę więc, że powinienem zagłębić się w szyfry. – avil

0

Naprawiłem problem z handshake dziś rano, porównując logi Wiresharka z Google Chrome (który działał dobrze) i mojej aplikacji (z problemami handshake). Okazało się, że musiałem włączyć rozszerzenie "signature_algorithms".

Używam jednak SecureBlackBox (a nie indy i openssl), ponieważ musiałem dynamicznie ładować certyfikat klienta, ale może to może pomóc (porównać i debugować za pomocą wireshark!).

+0

Niestety, to nie moja sprawa. Indy używa sygnaturowych algorytmów, zaznaczając wszystkie podpisy (od SHA1 + RSA/DSA/ECDSA do SHA512). Próba sprawdzenia, czy inne rozszerzenia mogą spowodować problem (np. Rozszerzenie rytmu serca, które było używane w żądaniach indy, ale nie w przeglądarce) lub czegoś brakuje. Będzie dużo bólu podczas gry z flagami DLL T_T. Lista szyfrów jest identyczna z bankomatem przeglądarki. – avil