Delphi 带TLS版本的Indy奇数/绞合行为

Delphi 带TLS版本的Indy奇数/绞合行为,delphi,indy,Delphi,Indy,有时,即使将显式版本设置为TLSv1.2,我也会得到TLSv1 我得到一个例外: 首次机会例外价格为$75D917D2。例外类 带有消息“连接SSL时出错”的EIdOSSLConnectError。EOF是 已观察到违反了“协议” 我的Delphi版本: Embarcadero®RAD Studio 10西雅图版本23.0.21418.4207 我在Windows 10上: Microsoft Windows[版本10.0.17134.345] 我的印地版本:10.6.2.5311——这就是西雅

有时,即使将显式版本设置为TLSv1.2,我也会得到TLSv1

我得到一个例外:

首次机会例外价格为$75D917D2。例外类 带有消息“连接SSL时出错”的EIdOSSLConnectError。EOF是 已观察到违反了“协议”

我的Delphi版本: Embarcadero®RAD Studio 10西雅图版本23.0.21418.4207

我在Windows 10上: Microsoft Windows[版本10.0.17134.345]

我的印地版本:10.6.2.5311——这就是西雅图即将推出的版本

当它工作时,这是一个跟踪:

当它不工作时,这是一个跟踪:

如您所见,它是TLSv1。为什么?

我看了以下问题:

下面是我的示例代码:

procedure TOpenWeatherFr.SetIcon(const IconCode: String);
var
  HTTPS: TSSLHTTP;
  MS : TMemoryStream;
  PNG: TPngImage;
  URL: string;
begin
  HTTPS := TSSLHTTP.Create(nil);
  MS := TMemoryStream.Create;
  PNG := TPngImage.Create;
  URL := 'https://openweathermap.org/img/w/' + IconCode + '.png';
  try
    (HTTPS.IOHandler as TIdSSLIOHandlerSocketOpenSSL).SSLOptions.SSLVersions := [sslvTLSv1_2];
    HTTPS.Get(URL, MS);
    MS.Seek(0, soFromBeginning);
    PNG.LoadFromStream(MS);
    Image1.Picture.Assign(PNG);
  finally
    HTTPS.Free;
    PNG.Free;
    MS.Free;
  end;
  Image1.Visible := true;
end;
为了完整起见,这里是TSSLHTTP的代码。其目的是一个没有SNI支持的老印地版本

unit SSLHTTP;

interface

uses
  Classes, IdHTTP, IdSSLOpenSSLHeaders, IdCTypes;

type
  TSSLHTTP = class(TIdHTTP)
  private
    procedure OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
  public
    constructor Create(AOwner: TComponent);
  end;

implementation

uses
  IdSSLOpenSSL;

{ TSSLHTTP }

constructor TSSLHTTP.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(self);
  (IOHandler as TIdSSLIOHandlerSocketOpenSSL).OnStatusInfoEx := OnStatusInfoEx;
end;

procedure TSSLHTTP.OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL;
  const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
begin
  SSL_set_tlsext_host_name(AsslSocket, Request.Host);
end;

end.
我的错在哪里?我做错了什么?这是我下载的图像的URL:

编辑:将paylod添加为十六进制dumb

工作负载-客户端你好:

0000   16 03 01 01 49 01 00 01 45 03 03 8b 3d e5 54 59
0010   f8 59 44 82 f7 14 92 45 50 e1 a3 86 68 3a c2 94
0020   76 be ea 8b 54 98 f3 27 69 50 af 00 00 94 c0 30
0030   c0 2c c0 28 c0 24 c0 14 c0 0a 00 a3 00 9f 00 6b
0040   00 6a 00 39 00 38 c0 32 c0 2e c0 2a c0 26 c0 0f
0050   c0 05 00 9d 00 3d 00 35 00 88 00 87 00 84 c0 2f
0060   c0 2b c0 27 c0 23 c0 13 c0 09 00 a2 00 9e 00 67
0070   00 40 00 33 00 32 c0 31 c0 2d c0 29 c0 25 c0 0e
0080   c0 04 00 9c 00 3c 00 2f 00 9a 00 99 00 45 00 44
0090   00 96 00 41 00 07 c0 11 c0 07 c0 0c c0 02 00 05
00a0   00 04 c0 12 c0 08 00 16 00 13 c0 0d c0 03 00 0a
00b0   00 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03
00c0   00 ff 01 00 00 88 00 00 00 17 00 15 00 00 12 6f
00d0   70 65 6e 77 65 61 74 68 65 72 6d 61 70 2e 6f 72
00e0   67 00 0b 00 04 03 00 01 02 00 0a 00 34 00 32 00
00f0   0e 00 0d 00 19 00 0b 00 0c 00 18 00 09 00 0a 00
0100   16 00 17 00 08 00 06 00 07 00 14 00 15 00 04 00
0110   05 00 12 00 13 00 01 00 02 00 03 00 0f 00 10 00
0120   11 00 23 00 00 00 0d 00 20 00 1e 06 01 06 02 06
0130   03 05 01 05 02 05 03 04 01 04 02 04 03 03 01 03
0140   02 03 03 02 01 02 02 02 03 00 0f 00 01 01
无效负载-客户端你好:

0000   16 03 01 01 49 01 00 01 45 03 03 f6 7b de 81 5d
0010   76 74 a7 31 99 36 8d 17 4c 07 5e 73 5d f7 b8 a1
0020   4f 06 5e 91 e5 f0 4b 37 0d 65 e7 00 00 94 c0 30
0030   c0 2c c0 28 c0 24 c0 14 c0 0a 00 a3 00 9f 00 6b
0040   00 6a 00 39 00 38 c0 32 c0 2e c0 2a c0 26 c0 0f
0050   c0 05 00 9d 00 3d 00 35 00 88 00 87 00 84 c0 2f
0060   c0 2b c0 27 c0 23 c0 13 c0 09 00 a2 00 9e 00 67
0070   00 40 00 33 00 32 c0 31 c0 2d c0 29 c0 25 c0 0e
0080   c0 04 00 9c 00 3c 00 2f 00 9a 00 99 00 45 00 44
0090   00 96 00 41 00 07 c0 11 c0 07 c0 0c c0 02 00 05
00a0   00 04 c0 12 c0 08 00 16 00 13 c0 0d c0 03 00 0a
00b0   00 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03
00c0   00 ff 01 00 00 88 00 00 00 17 00 15 00 00 12 6f
00d0   70 65 6e 77 65 61 74 68 65 72 6d 61 70 2e 6f 72
00e0   67 00 0b 00 04 03 00 01 02 00 0a 00 34 00 32 00
00f0   0e 00 0d 00 19 00 0b 00 0c 00 18 00 09 00 0a 00
0100   16 00 17 00 08 00 06 00 07 00 14 00 15 00 04 00
0110   05 00 12 00 13 00 01 00 02 00 03 00 0f 00 10 00
0120   11 00 23 00 00 00 0d 00 20 00 1e 06 01 06 02 06
0130   03 05 01 05 02 05 03 04 01 04 02 04 03 03 01 03
0140   02 03 03 02 01 02 02 02 03 00 0f 00 01 01

再仔细看看,您提供的两个屏幕截图都显示了TLS v1.2客户端请求,而不是TLS v1.0(查看
握手协议中的
版本,而不是
记录层中的版本)。您应该升级到最新的Indy 10版本(目前为10.6.2.5485),(现在已经有近3年的历史了),这样您就不再需要
TSSLHTTP
类了。您是对的。如果在我们自制的框架中升级就这么简单的话。回到主题:为什么在10个请求中有2个或3个出现异常?您显示的代码很好。您只需更深入地分析TLS客户机hellos(您的屏幕截图不会扩展所有内容),以了解工作和非工作案例之间的差异。“观察到EOF”表示服务器在TLS握手完成之前关闭了其端的连接,这意味着服务器很可能不喜欢Hello中的某些内容,并选择在关闭连接之前不发送解释原因的TLS警报。如果您找不到任何差异,那么服务器端可能存在问题,您将无法在客户端对其进行任何处理。感谢您确认我的代码没有问题。除了32个随机字节外,我找不到任何不明显的变化。我很好奇为什么wireshark会误解协议。如果wiresharks显示TLSv1,我就有问题了。我在我的问题中添加了有效载荷。16 03 01 01 49 01 00 01 45 03 03 03 03 03 | |>16=不知道>03 01=TLS v1.0>01 49=Length=329>00=不知道>01 45=Length=325>03 03=TLS v1.2 | |从屏幕截图上可以看出,这两个版本都是相同的