Indy SSL无法按预期工作

时间:2017-08-16 13:10:22

标签: delphi idhttp

以下代码如图所示,但没有注释掉的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_READ_BYTES:sslv3警报握手失败

1 个答案:

答案 0 :(得分:1)

您显示的两个网址已经网址编码,因此您根本不应将其传递给TIdURI.URLEncode(),只需按原样将其传递给TIdHTTP.Get() 。话虽如此,请确保您使用的是Indy的最新版本,以便this bug fix避免对已经百分比编码的任何序列进行双重编码。

在任何情况下,您遇到的问题与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浏览器支持TLS 1.0 +。

因此修复是在TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions属性 1 中启用TLS 1.1和TLS 1.2。

1 :我在Indy的问题跟踪器中opened a ticket默认情况下在将来的版本中启用TLS 1.1+。