Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Indy SSL未按预期工作_Delphi_Idhttp - Fatal编程技术网

Delphi Indy SSL未按预期工作

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);

以下代码如图所示工作,但不适用于注释掉的URL

你能看出我的错误吗

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版本有关。正如我早些时候告诉你的,“你正在使用一个非常过时的[印地]版本,需要升级”。请仔细阅读这篇文章。