Autor Téma: Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2  (Přečteno 899 krát)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 777
  • Karma: 43
    • Verze Delphi: 10.3
Ahoj,

používám něco jako:
Kód: Delphi [Vybrat]
  1. fIdHttp:=tIdHttp.Create;
  2. // ... nastavit pár parametrů
  3. fIdHttp.Get(aServer+aPozadavek, AktVystup);

Nyní jsem narazil na problém - při pokusu o stažení https://kataster.skgeodesy.sk/eskn/services/NR/kn_wms_orto/MapServer/WMSServer?request=GetCapabilities&service=WMS dostávám výjimku Project spw.exe raised exception class EIdOSSLUnderlyingCryptoError with message 'Error connecting with SSL.
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure'.

Ukázalo se, že řešením je:
Kód: Delphi [Vybrat]
  1. fIdHttp:=tIdHttp.Create;
  2. // ... nastavit pár parametrů
  3. if not Assigned(fIdHttp.IOHandler) then begin
  4.  fIdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  5.  TIdSSLIOHandlerSocketOpenSSL(fIdHTTP.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
  6. end;
  7. fIdHttp.Get(aServer+aPozadavek, AktVystup);

Dá se nějak zařídit, aby si Indy ty různé verze TLS dle potřeby použilo samo a nemusel jsem na to myslet? (Mimochodem, proč je vlastně nepoužije, když je umí?)
V IdSSLOpenSSL.pas mají:
Kód: Delphi [Vybrat]
  1. const DEF_SSLVERSIONS = [sslvTLSv1];
ale přepsat to tam se mi moc nechce... Možná to jde někde nastavit, jenže to asi nemám šanci najít...

Díky,

Karel


Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2593
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #1 kdy: 18-01-2019, 19:52:40 »
(Mimochodem, proč je vlastně nepoužije, když je umí?)
No protoze to jsou Pindy...
Citace
Možná to jde někde nastavit, jenže to asi nemám šanci najít...
Podle toho, co pise tady ti nesjpis nezbyde nic jineho, nez nastavovat to SSLOptions

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2346
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #2 kdy: 19-01-2019, 00:32:14 »
Jen pro zajímavost, když použijes THTTPClient ze System.Net.httpclient, který je ted preferovany a pouziva primo veci z OS bez Indy, tak by to melo pomoci ne?
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 777
  • Karma: 43
    • Verze Delphi: 10.3
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #3 kdy: 19-01-2019, 10:11:59 »
Jen pro zajímavost, když použijes THTTPClient ze System.Net.httpclient, který je ted preferovany a pouziva primo veci z OS bez Indy, tak by to melo pomoci ne?

Otestováno a tHttpClient opravdu funguje pěkně, aniž by bylo nutné s TLS laborovat. Díky za nasměrování.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 777
  • Karma: 43
    • Verze Delphi: 10.3
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #4 kdy: 19-01-2019, 10:33:17 »
Metodou try..except konkretni vyjimky ve smycce (jinak receno, pokus&omyl), viz. toto vlakno:

Když jsem použil:
Kód: Delphi [Vybrat]
  1. TIdSSLIOHandlerSocketOpenSSL(fIdHTTP.IOHandler).SSLOptions.SSLVersions:=[sslvSSLv2,sslvSSLv3,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2];
Tak spojení funguje na první pokus k serveru, který podporuje jen TLS 1.2.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2346
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #5 kdy: 19-01-2019, 11:24:10 »
Jen pro zajímavost, když použijes THTTPClient ze System.Net.httpclient, který je ted preferovany a pouziva primo veci z OS bez Indy, tak by to melo pomoci ne?

Jen dodam, ze temi vecmi z OS je WinHTTP API...

Ja vím, ale to platí jen pro windows, proto jsem napsal OS, protože jsem chtěl naznačit že je to multiplatformní. No nic :-)
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 777
  • Karma: 43
    • Verze Delphi: 10.3
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #6 kdy: 19-01-2019, 11:26:49 »
Ja vím, ale to platí jen pro windows, proto jsem napsal OS, protože jsem chtěl naznačit že je to multiplatformní. No nic :-)

Multiplatformní a navíc se zdá, že by měl dobře umět asynchronní stahování, takže bych si ušetřil nervy s thready :-)