Delphi 11 中是否有 SSL 行为变化?
Are there SSL behaviour changes in Delphi 11?
几个月来,我一直使用带有 Delphi 10.3 的 IdWebSocketSimpleClient 单元 here 来设置与 discord 网关 API 的 Websocket 连接。现在,我更改为 Delphi 11,相同的代码显示了另一种行为。
之前,连接到服务器的组件发起了对 websocket 连接的 HTTP 升级,收到 101 - 切换协议响应并开始通信。现在,Delphi 11,我收到一个 400 - 错误请求。内部错误消息显示“纯 HTTP 请求已发送到 HTTPS 端口”。在这两种情况下,相同的 OpenSSL dll 文件位于应用程序可执行文件夹中,并且使用了 TIdSSLIOHandlerSocketOpenSSL 组件。
在这一点上,我真的很困惑为什么会这样,因为程序代码没有被更改。这让我想知道所涉及的印地单位是否有任何行为变化。我什至不知道从哪里开始我的调查。有人可以帮忙吗?
Delphi 10.3 于 2018 年底发布。2019 年底对 TIdSSLIOHandlerSocketBase
class 进行了更改,以修复其 PassThrough
属性 被初始化为 False
而它应该被初始化为 True
而不是(现在是当前行为)。
因此,这很容易解释您所看到的行为,因为错误消息抱怨将不安全的 HTTP 消息发送到安全的 HTTPS 端口(因为 PassThrough
可能 True
).
该更改并未影响大多数 Indy 组件,因为它们在内部根据需要明确设置了 PassThrough
(通常基于 UseTLS
属性 或特定的 URL protocol/port 被请求)。但是,更改确实会影响直接使用 TIdTCPClient
的 end-user 代码(正如此 WebSocket 代码所做的那样)。在这种情况下,用户(并且一直是)负责根据需要设置 PassThrough
,但此 WebSocket 代码并未这样做。当连接到安全 URL 时,它 假定 在调用 TIdSimpleWebSocketClient.Connect()
之前用户已将 PassThrough
设置为 False
,而不是 强制 到 False
。如果 TIdSimpleWebSocketClient
需要 auto-create 它自己的 SSLIOHandler
对象,那么 PassThrough
肯定不会被设置为 False
。
TIdSimpleWebSocketClient.Connect()
应该 在调用 inherited Connect
之前在内部设置 PassThrough := not lSecure;
。我已将此作为错误报告给作者:
同时,在作者修复此错误之前,您可以简单地将自己的 SSLIOHandler
组件分配给 TIdSimpleWebSocketClient.IOHandler
属性 并在之前将其设置为 PassThrough=False
用 wss:
URL.
调用 TIdSimpleWebSocketClient.Connect()
几个月来,我一直使用带有 Delphi 10.3 的 IdWebSocketSimpleClient 单元 here 来设置与 discord 网关 API 的 Websocket 连接。现在,我更改为 Delphi 11,相同的代码显示了另一种行为。
之前,连接到服务器的组件发起了对 websocket 连接的 HTTP 升级,收到 101 - 切换协议响应并开始通信。现在,Delphi 11,我收到一个 400 - 错误请求。内部错误消息显示“纯 HTTP 请求已发送到 HTTPS 端口”。在这两种情况下,相同的 OpenSSL dll 文件位于应用程序可执行文件夹中,并且使用了 TIdSSLIOHandlerSocketOpenSSL 组件。
在这一点上,我真的很困惑为什么会这样,因为程序代码没有被更改。这让我想知道所涉及的印地单位是否有任何行为变化。我什至不知道从哪里开始我的调查。有人可以帮忙吗?
Delphi 10.3 于 2018 年底发布。2019 年底对 TIdSSLIOHandlerSocketBase
class 进行了更改,以修复其 PassThrough
属性 被初始化为 False
而它应该被初始化为 True
而不是(现在是当前行为)。
因此,这很容易解释您所看到的行为,因为错误消息抱怨将不安全的 HTTP 消息发送到安全的 HTTPS 端口(因为 PassThrough
可能 True
).
该更改并未影响大多数 Indy 组件,因为它们在内部根据需要明确设置了 PassThrough
(通常基于 UseTLS
属性 或特定的 URL protocol/port 被请求)。但是,更改确实会影响直接使用 TIdTCPClient
的 end-user 代码(正如此 WebSocket 代码所做的那样)。在这种情况下,用户(并且一直是)负责根据需要设置 PassThrough
,但此 WebSocket 代码并未这样做。当连接到安全 URL 时,它 假定 在调用 TIdSimpleWebSocketClient.Connect()
之前用户已将 PassThrough
设置为 False
,而不是 强制 到 False
。如果 TIdSimpleWebSocketClient
需要 auto-create 它自己的 SSLIOHandler
对象,那么 PassThrough
肯定不会被设置为 False
。
TIdSimpleWebSocketClient.Connect()
应该 在调用 inherited Connect
之前在内部设置 PassThrough := not lSecure;
。我已将此作为错误报告给作者:
同时,在作者修复此错误之前,您可以简单地将自己的 SSLIOHandler
组件分配给 TIdSimpleWebSocketClient.IOHandler
属性 并在之前将其设置为 PassThrough=False
用 wss:
URL.
TIdSimpleWebSocketClient.Connect()