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

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 836
  • Karma: 45
    • 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ů: 2623
  • 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ů: 2402
  • Karma: 103
    • 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

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 836
  • Karma: 45
    • 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í.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 836
  • Karma: 45
    • 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ů: 2402
  • Karma: 103
    • 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

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 836
  • Karma: 45
    • 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 :-)

Offline gviewcz

  • Nováček
  • *
  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: 2007
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #7 kdy: 23-10-2019, 11:42:03 »
Dobrý den, prosím o radu. Mořím se s TIdHttp pro práci se stránkami v https (tedy s SSL), stále to chce loudovat nějaké knihovny. Tady uvádíte možnost namísto Indy použít System.Net.httpclient, ale vzhledem k tomu, že s multiplatformálním vývojem ani s prostředím 10.3 zatím nemám zkušenosti, nevím, jak to konkrétně udělat.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 836
  • Karma: 45
    • Verze Delphi: 10.3
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #8 kdy: 23-10-2019, 11:46:50 »
Zhruba:

Kód: Delphi [Vybrat]
  1. procedure HttpProvedStazeniSouboru(aUrl:string; aCil:tMemoryStream);
  2.  var h:THTTPClient;
  3.      r:IHTTPResponse;
  4.      ProxyPort:integer;
  5.  begin
  6.  h:=THTTPClient.Create;
  7.  try
  8.   r:=h.Get(aUrl);
  9.   if not Assigned(r) then Abort;
  10.   if (r.StatusCode<200)or(r.StatusCode>299) then Abort;
  11.   aCil.CopyFrom(r.ContentStream, r.ContentStream.Size);
  12.   r:=nil;
  13.  finally
  14.   FreeAndNil(h);
  15.  end;
  16. end;
  17.  

Offline gviewcz

  • Nováček
  • *
  • Příspěvků: 10
  • Karma: 0
    • Verze Delphi: 2007
Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
« Odpověď #9 kdy: 23-10-2019, 12:17:19 »
Díky, zkusím...