Forum Delphi.cz

Delphi => Obecné => Téma založeno: vandrovnik 18-01-2019, 18:47:01

Název: Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: vandrovnik 18-01-2019, 18:47:01
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

Název: Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: pf1957 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 (https://stackoverflow.com/a/22118046/1617116) ti nesjpis nezbyde nic jineho, nez nastavovat to SSLOptions
Název: Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: Radek Červinka 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?
Název: Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: vandrovnik 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í.
Název: Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: vandrovnik 19-01-2019, 10:33:17
Metodou try..except konkretni vyjimky ve smycce (jinak receno, pokus&omyl), viz. toto vlakno (https://stackoverflow.com/questions/22101816):

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.
Název: Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: Radek Červinka 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 (https://docs.microsoft.com/en-us/windows/desktop/api/winhttp/)...

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 :-)
Název: Re:Delphi 10.3 - tIdHttp.Get https - TLSv1 x TLSv1_1 x TLSv1_2
Přispěvatel: vandrovnik 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 :-)