Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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 ssl v3卷毛狗和indy一起移动到tls_Delphi_Ssl_Indy - Fatal编程技术网

Delphi ssl v3卷毛狗和indy一起移动到tls

Delphi ssl v3卷毛狗和indy一起移动到tls,delphi,ssl,indy,Delphi,Ssl,Indy,正如你所知,新的是在镇上,女巫吠叫不得不放弃支持SSL3 Indy(TidHttp)10.6.0.0重新激活了这个很好的例外: EidOsslUnerlayingCryptoError消息“连接SSL时出错。”。 错误:14094410:SSL例程:SSL3_读取字节:sslv3警报握手 失败' 我的问题是,处理TLS需要什么定义 更新: 下面是引发异常的代码:完整工作代码 var parameters:TStringList; keySecretBase64:string; str

正如你所知,新的是在镇上,女巫吠叫不得不放弃支持SSL3

Indy(TidHttp)10.6.0.0重新激活了这个很好的例外:

EidOsslUnerlayingCryptoError消息“连接SSL时出错。”。 错误:14094410:SSL例程:SSL3_读取字节:sslv3警报握手 失败'

我的问题是,处理TLS需要什么定义

更新: 下面是引发异常的代码:完整工作代码

var
  parameters:TStringList;
  keySecretBase64:string;
  stream:TStringStream;
  IdEncoderMIME1 : TIdEncoderMIME;
  idHttp1 : TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL1:TIdSSLIOHandlerSocketOpenSSL;//assume on Form
begin
  stream:=TStringStream.create;
  parameters:=TStringList.Create;
  IdEncoderMIME1 := TIdEncoderMIME.Create(nil);
  idHttp1 := TIdHTTP.Create(nil);
  IdSSLIOHandlerSocketOpenSSL1:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_2;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];
    with IdSSLIOHandlerSocketOpenSSL1 do begin
      SSLOptions.Method := sslvSSLv3;
      SSLOptions.Mode :=  sslmUnassigned;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 2;
    end;
    with idHttp1 do begin
      IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      ReadTimeout := 0;
      AllowCookies := True;
      ProxyParams.BasicAuthentication := False;
      ProxyParams.ProxyPort := 0;
      Request.ContentLength := -1;
      Request.ContentRangeEnd := 0;
      Request.ContentRangeStart := 0;
      Request.ContentType := 'application/x-www-form-urlencoded';
      Request.Accept := 'text/html, */*';

      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;
    parameters.Clear;
    idHttp1.Request.CustomHeaders.Clear;
    IdEncoderMIME1.FillChar:='=';

  try
    keySecretBase64 := TIdEncoderMIME.EncodeString(key+ ':' + secret, IndyTextEncoding_UTF8);// this is twitter provided key and secret
    parameters.Add('grant_type=client_credentials');
    idHttp1.Request.CustomHeaders.AddValue('Authorization','Basic '+keySecretBase64);
    idHttp1.post(URL,parameters,stream);
  finally
    stream.Free;
    parameters.Free;
    parameters.Free;
    IdSSLIOHandlerSocketOpenSSL1.Free;
  end;
end;

SSL2、SSL3和TLS1.0都容易受到中间人攻击。您应该使用TLS 1.1和更高版本进行安全连接。不幸的是,Indy 9不支持TLS 1.1和更高版本


报告Indy 10中的TLS 1.2有一个选项TLSv1_2,但Indy 10中未显示该选项。

您的代码在SSLOptions属性
方法中选择
TLS 1.2

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_2;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];
但是,两行之后,该值将被SSL 3覆盖:

with IdSSLIOHandlerSocketOpenSSL1 do begin
  SSLOptions.Method := sslvSSLv3;
  ...
end;
因此,客户端将不会连接到较新的TLS 1.2协议,而是连接到服务器不再支持的SSL 3

这解释了错误消息,该消息表示SSL 3握手(客户端尝试)失败:

SSL。错误:14094410:SSL例程:SSL3_读取字节:sslv3警报握手 失败'


如果删除第二个分配,IdHTTP客户端将使用TLS 1.2进行连接。

您仅使用TLSv1进行连接,因此只能使用SSLv23通配符或TLSv1连接到服务器,否则TLSv1握手将失败。示例代码可能会短得多-仅
IdHTTP.Get('https://www.google.com')
或其他https地址,且SSLIOHandler部分为requiredtrue。然而,谷歌并不否认ssl和强制tls,据我所知,请查看关于twitter和cloudflare的第二个链接。@MSchenkel:Indy 10.6中的
TIdTextEncoding
类被一个新的
IIdTextEncoding
接口取代。请参阅。@mjn:如果您考虑到
TIdHTTP
现在可以创建自己的
SSLIOHandler
(默认为TLSv1),那么在请求HTTPS url时,如果尚未分配一个,则代码可以进一步缩短。请参阅。您确实解决了该问题,但是现在出现了“Soket Error#10054连接被对等方重置”,这不会使tls连接成功。原因代码不完整。