使用Delphi 12与Indy 10.6.2搭建SSL TCP通信时遇版本号错误
解决Indy SSL错误:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
你遇到的这个错误并非真的是SSL3版本冲突,而是SSL握手过程中数据格式不匹配导致的误报,以下是针对性的修复方案:
核心问题排查与修复
1. 修正服务器SSL Handler模式
服务器端TIdServerIOHandlerSSLOpenSSL的模式必须明确设置为服务器模式,原配置的sslmUnassigned会导致SSL上下文初始化异常:
// 可在DFM直接修改或代码中设置 sSSLHandler.SSLOptions.Mode := sslmServer;
2. 配置有效端口与IP绑定
- 服务器端:
原配置DefaultPort = 0和Bindings = <>无法正常监听端口,需添加IP绑定并设置有效端口(如8443):
也可直接在DFM中配置Bindings的IP和Port参数。// 代码示例:添加监听绑定 with IdTCPServer.Bindings.Add do begin IP := '0.0.0.0'; // 监听所有网络接口 Port := 8443; end; - 客户端:
将IdTCPClient.Port设置为与服务器一致的端口(如8443),并指定服务器的Host地址。
3. 确保OpenSSL库兼容性
Indy 10.6.2需要匹配版本的OpenSSL动态库:
- 32位程序:使用
libeay32.dll/ssleay32.dll或OpenSSL 1.1.x系列的libcrypto-1_1.dll/libssl-1_1.dll - 64位程序:使用对应64位版本的库
- 确保库文件放置在程序运行目录或系统路径中,且版本支持TLS 1.2
4. 简化SSL PassThrough设置
无需在OnConnect事件中动态设置PassThrough,直接在服务器SSL Handler属性中设置PassThrough = False,连接建立后会自动触发SSL握手,避免代码执行时机问题。
5. 验证证书与密钥有效性
确认file.pem和file.key路径正确:
- 证书为PEM格式的有效服务器证书
- 密钥为对应证书的私钥,若有密码需设置
SSLOptions.Password
验证修复
修改配置后重启服务器,客户端连接时应能正常完成TLS 1.2握手,不再抛出版本错误。
内容的提问来源于stack exchange,提问作者Robe79
相关产品推荐
相关产品推荐

