Delphi Indy SSL未按预期工作
以下代码如图所示工作,但不适用于注释掉的URL 你能看出我的错误吗Delphi Indy SSL未按预期工作,delphi,idhttp,Delphi,Idhttp,以下代码如图所示工作,但不适用于注释掉的URL 你能看出我的错误吗 var IdHTTP1: TIdHTTP; sl: TStringList; Src : string; LHandler: TIdSSLIOHandlerSocketOpenSSL; begin try IdHTTP1 := TIdHTTP.Create(nil); try LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
var
IdHTTP1: TIdHTTP;
sl: TStringList;
Src : string;
LHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
try
IdHTTP1 := TIdHTTP.Create(nil);
try
LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
IdHTTP1.IOHandler := LHandler;
Src := IdHTTP1.Get(TIdURI.URLEncode(
//'https://geocoding.geo.census.gov/geocoder/locations/onelineaddress?address=4600+Silver+Hill+Rd%2C+Suitland%2C+MD+20746&benchmark=9&format=json'
'https://tools.usps.com/go/ZipLookupResultsAction!input.action?resultMode=0&companyName=&address1=1600+PENNSYLVANIA+AVE+NW&address2=&city=&state=Select&urbanCode=&postalCode=&zip=20500'
));
ShowMessage(Copy(src, 1, 100));
finally
LHandler.Free;
end;
finally
IdHTTP1.Free;
end;
except
on E: Exception do
ShowMessage('e');
end;
ShowMessage('done');
end;
已注释的URL引发异常:
EIdOSSLUnderlyingCryptoError:连接SSL时出错。连接SSL时出错。错误:14094410:SSL例程:SSL3_读取字节:sslv3警报握手失败
您显示的两个url已经是url编码的,因此您根本不应该将它们传递给
TIdURI.URLEncode()
,只需按原样传递给TIdHTTP.Get()
。这就是说,确保您使用的是最新版本的Indy,这样您就必须避免对任何已进行百分比编码的序列进行双重编码
无论如何,您遇到的问题与URL编码无关。SSL警报错误的原因是TIdSSLIOHandlerSocketOpenSSL
默认情况下仅启用TLS 1.0,但许多现代web服务器正在慢慢远离TLS 1.0,现在需要TLS 1.1+geocoding.geo.census.gov
不能使用TLS 1.2以下的版本,而tools.usps.com
仍然允许TLS 1.0。现代web浏览器支持TLS1.0+
因此,修复方法是在TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions
属性1中启用TLS1.1和TLS1.2
1:我在Indy的问题跟踪器中有一个选项,在未来的版本中默认启用TLS 1.1+。“未按预期工作”-那么您期望的是什么,它实际上做了什么?-例外情况是什么?(提示:将
showmessage('e')
更改为raise
)。EIdOSSLUnderlyingCryptoError:连接SSL时出错。连接SSL时出错。错误:14094410:SSL例程:SSL3_读取字节:sslv3警报握手失败这表明读取错误消息很重要。不要忽略它们的内容。它们通常包含有价值的信息。如果你是一名机修工,我把我的车带到你面前,对你说“发动机有故障,请修理”,你能猜到我的问题是引擎盖下的嘎嘎声吗。不要同时指定方法
和sslversion
,请指定其中一个。分配一个会自动为您更新另一个。2.如果你的Indy 10版本没有sslvTLSv1_2
,那么你使用的是一个非常过时的版本,需要升级,无论如何你都必须这样做才能支持最新的OpenSSL。@kualoa:你必须根据你的应用程序的编译方式(32位或64位)使用正确的OpenSSL版本,而不是根据你运行的操作系统版本。您可以在@kualoa获得Indy的预编译OpenSSL DLL:所有下载的文件名中都有OpenSSL版本号和平台名。要想知道使用哪一个并不难-win32
用于32位,而win64
用于64位。Indy支持的OpenSSL的最新版本是1.0.2。Fulgan上提供的最新DLL用于OpenSSL 1.0.2l(又名1.0.2.12)。放置DLL的最佳位置是与应用程序的可执行文件位于同一文件夹中。@kualoa:0.9.8是非常旧的OpenSSL版本。您应该改用1.0.2。在任何情况下,“未识别标识符”错误与您使用的OpenSSL DLL版本无关,它与您正在使用的Indy版本有关。正如我早些时候告诉你的,“你正在使用一个非常过时的[印地]版本,需要升级”。请仔细阅读这篇文章。