gpt4 book ai didi

delphi - 为什么在 Delphi 2010 中将 SSl 添加到 Indy 邮政编码查找示例时得到 "wrong version error"?

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:14 32 4
gpt4 key购买 nike

我想我会尝试一些简单的东西来尝试理解 Web 客户端/服务器应用程序,因为我对此一无所知,但我需要学习。我从网络(客户端和服务器)下载了“邮政编码查找”示例。编译它们,一切都像宣传的那样工作。

然后我在每个表单上放置了一个 SSL IO 处理程序,并将它们指定为处理程序,并在两个表单中都选择了“sslvTLSv1”。现在它不起作用。每次我尝试在客户端应用程序中查找邮政编码时,我都会收到“错误:1408F10B:SSL 例程:SSL3_GET_RECORD:版本号错误”。我卸载了原来的 Indy 库并安装了最新版本 (10.6.2.5264)。只是为了确定,我得到了最新的 SSL 库并将它们放在两个程序文件夹中。

我在 Indy 中查看了许多关于 SSL 的问题和答案,它似乎应该有效。我错过了什么?

这是来自服务器 DFM 的相关部分:

object IdTCPServer1: TIdTCPServer
Active = True
Bindings = <
item
IP = '127.0.0.1'
Port = 6000
end>
DefaultPort = 6000
IOHandler = Handler
OnConnect = IdTCPServer1Connect
OnExecute = IdTCPServer1Execute
Left = 32
Top = 24
end
object Handler: TIdServerIOHandlerSSLOpenSSL
SSLOptions.Mode = sslmServer
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
Left = 100
Top = 32
end

这是客户 DFM 的相关部分。

object Client: TIdTCPClient
IOHandler = Handler
ConnectTimeout = 0
Host = '127.0.0.1'
IPVersion = Id_IPv4
Port = 6000
ReadTimeout = -1
Left = 209
Top = 16
end
object Handler: TIdSSLIOHandlerSocketOpenSSL
Destination = '127.0.0.1:6000'
Host = '127.0.0.1'
MaxLineAction = maException
Port = 6000
DefaultPort = 0
SSLOptions.Mode = sslmClient
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
Left = 296
Top = 32
end

在尝试了 Remy 的建议之后

我添加了将 PassThrough 设置为 false 的代码,现在我得到了一个不同的错误。“错误:14094410:SSL 例程:ssl3_read_bytes:sslv3 警报握手失败。”

对于那些想要查看源代码的人,它位于网络上 http://www.atozedsoftware.com/indy/demos/10/index.EN.aspx (我正在使用服务器的 OnExecute 版本)。现在唯一的区别是每个单元中设置 PassThrough 模式的线路。

在服务器代码中:

procedure TformMain.IdTCPServer1Connect(AContext: TIdContext);
begin
TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
AContext.Connection.IOHandler.WriteLn('200 Zip Code Server Ready.');
AContext.Data := TUserData.Create;
end;

在客户端代码中:

procedure TformMain.butnLookupClick(Sender: TObject);
var
i: integer;
begin
butnLookup.Enabled := False; try
lboxResults.Clear;
Handler.PassThrough := False;

最佳答案

您没有显示任何代码,只显示了您的 DFM。这还不够。但我怀疑 可能 发生的情况是您在客户端将 IOHandler.PassThrough 属性设置为 false,但在服务器端却没有这样做。

当客户端连接到 TIdTCPServer 时,默认情况下服务器不会激活 SSL/TLS,因此服务器可以分析客户端,甚至可能在决定是否启用 SSL/TLS 之前与其进行不安全的通信需要。这是为了便于服务器监听多个端口,而并非所有端口都使用 SSL/TLS(想想 HTTP 与 HTTPS),并处理基于 STARTTLS 的协议(protocol)。

因此,如果您还没有这样做,请确保将连接两端的 IOHandler.PassThrough 设置为 false,例如:

Handler.PassThrough := False;
IdTCPClient1.Connect;

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
end;

如果您确实在两端都这样做,但仍然遇到相同的错误,那么请确保 IOHandler.SSLOptions.SSLMethod/IOHandler.SSLOptions.TLSVersions两端的属性确实配置正确,并且它们使用的是兼容设置。你说你在两端都使用 TLSv1,所以你不应该得到错误,除非服务器真的没有使用 TLSv1。

关于delphi - 为什么在 Delphi 2010 中将 SSl 添加到 Indy 邮政编码查找示例时得到 "wrong version error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824635/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com