SSL错误1409442E使用TIdHTTP通过HTTPS下载文件



我使用的是Delphi 10.3.3。下面的代码曾经有效,但现在我在尝试通过HTTPS下载文件时遇到错误:

连接SSL错误:1409442E:SSL例程:SSL3_READ_BYTES:tlsv1警报协议版本'

var
ms : tmemorystream;
ssl : TIdSSLIOHandlerSocketOpenSSL;
source,dest : string;
begin
source := 'https://www.myaddress.com/myfile.zip';
dest := 'c:myfile.zip';
ms := TMemoryStream.Create;
try
if pos('https',source) > 0 then
begin
ssl := TIdSSLIOHandlerSocketOpenSSL.Create();
idh.IOHandler := ssl;
end;
idhttp1.get(source,ms);
ms.savetofile(dest);
result := 'ok';
finally
ms.Free;
end;
end;

TIdSSLIOHandlerSocketOpenSSL默认情况下仅使用TLS v1.0,服务器拒绝使用。您必须明确允许更新的TLS版本:

ssl := TIdSSLIOHandlerSocketOpenSSL.Create();
ssl.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
idh.IOHandler := ssl;

Indy的最新版本内置了https支持(因此无需创建SSL IOHandler,Indy会自动处理(。此外,在处理文件时,最好使用TFilestream而不是TMemoryStream,因为在尝试下载不适合内存的文件时会遇到麻烦。

这里有一个MRE给你:

program SO60578855;
{$APPTYPE CONSOLE}
{$R *.res}
uses
idHttp,
Classes,
System.SysUtils;
var
Http : TidHttp;
Fs   : TFileStream;
begin
try
Fs := TFileStream.Create('c:temp100mb.bin', fmcreate);
Http := TidHttp.Create(nil);
try
Http.Get('https://speed.hetzner.de/100MB.bin', Fs);
finally
Http.Free;
Fs.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.

最新更新