ssl v3贵宾犬,并与indy一起搬到tls

时间:2014-10-20 15:25:44

标签: delphi ssl indy

如你所知,新的poodle在城里,Witch咆哮得{} {3}}放弃对SSL3的支持。

Indy(TidHttp)10.6.0.0恢复了这个不错的例外:

  

EidOsslUnerlayingCryptoError消息'使用SSL连接时出错。   错误:14094410:SSL例程:SSL3_READ_BYTES: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;

2 个答案:

答案 0 :(得分:3)

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

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 3握手(客户端尝试过)失败:

  

SSL。错误:14094410:SSL例程:SSL3_READ_BYTES:sslv3警报握手   失败'

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

答案 1 :(得分:1)

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

This answer报告在Indy 10中TLS 1.2有一个选项TLSv1_2,但在Indy 10 online documentation中没有显示。