SSL V3 Poodle攻击并转移到Indy的TLS

4

正如你所知,新的poodle已经来到了城里,这让Witch的吠声促使Twitter, Cloudflare停止支持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;

你的示例代码可以更短 - 只需要 IdHttp.Get('https://www.google.com') 或其他 https 地址和 SSLIOHandler 部分即可。 - mjn
然而Google并没有否认SSL和强制TLS,据我所知,请查看有关Twitter和Cloudflare的第二个链接。 - none
@RemyLebeau 我正在使用 Delphi 2007。请问在哪里可以找到与sslvTLSv1_2兼容的Indy10版本?我从http://indy.fulgan.com/zip/下载的版本会抛出“TIdTextEncoding未定义”的错误。 - M Schenkel
1
@MSchenkel:在Indy 10.6中,TIdTextEncoding类被新的IIdTextEncoding接口所取代。请参阅此博客文章 - Remy Lebeau
1
@mjn:如果考虑到TIdHTTP现在可以创建自己的SSLIOHandler(默认为TLSv1),则代码甚至可以进一步缩短,当请求HTTPS URL时,如果没有已经分配。请参阅此博客文章 - Remy Lebeau
显示剩余2条评论
2个回答

3

您的代码在 SSLOptions 属性 Method 中选择了 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_READ_BYTES:sslv3警报握手失败'

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


你已经进展了问题,但现在出现了“Soket错误#10054连接被对等方重置”,这导致TLS连接失败。原因代码不完整。 - none

1
SSL2、SSL3和TLS1.0都容易受到中间人攻击。为了保证安全连接,您应该使用TLS 1.1及以上版本。不幸的是,Indy 9不支持TLS 1.1及以上版本。 这篇答案报告称,在Indy 10中有一个名为TLSv1_2的选项可用于TLS 1.2,但在Indy 10 在线文档中未呈现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接