Perl 5.6.1连接MS SQL Server 2019报SSL错误如何解决
问题背景
当前使用Perl 5.6.1版本(团队近期计划将其迁移至更高版本),现有Perl脚本可正常连接MS SQL Server 2014,但连接MS SQL Server 2019时失败抛出错误,需在Perl 5.6.1环境下解决该连接问题。
测试用Perl代码
use MSSQL::DBlib; use MSSQL::Sqllib; # 连接MS SQL Server 2014时语句正常执行,连接SQL Server 2019时抛出错误 $dbSession = eval{ sql_init('xx.xxx.xxx.xx,port no','user','password',"database") }; die "dbconnect.pl: Error at sql_init." if $@; print "Db connected \n";
注:原测试代码中eval块内sql_init前多了一个多余的左括号,已修正,避免语法异常
报错信息
DB-Library error 10013,severity 11: DB-Library函数引用存在无效参数 DB-Library error 10004,severity 9: 无法连接:SQL Server不可用或不存在,发生SSL安全错误 OS error 772:Connection Open (SECDoClientHandshake())
故障根因
MSSQL::DBlib依赖传统DB-Library驱动(ntwdblib.dll),该老版本驱动默认仅支持TLS 1.0协议,而MS SQL Server 2019默认禁用TLS 1.0、TLS 1.1,仅开启TLS 1.2加密,老驱动无法完成TLS握手流程,同时老驱动不识别SQL Server 2019返回的高版本TDS协议字段,因此抛出参数无效、SSL连接错误。
可行解决方案(适配Perl 5.6.1环境,无需升级Perl版本)
- 方案1:服务端临时开启低版本TLS支持(过渡方案)
在SQL Server 2019所在服务器的SChannel配置中启用TLS 1.0支持,重启SQL Server服务后即可兼容老驱动连接。注意:TLS 1.0存在公开安全漏洞,该方案仅适合短期过渡使用,待Perl版本迁移完成后需及时关闭低版本TLS配置 - 方案2:替换客户端DB-Library驱动文件
获取对应架构(32位/64位,和你安装的Perl架构一致)、支持TLS 1.2的新版ntwdblib.dll文件,替换Perl安装路径bin目录下的旧版ntwdblib.dll,替换前备份原有文件,替换后无需修改业务代码即可正常连接。 - 方案3:连接参数强制关闭加密
在数据库连接逻辑中增加配置,强制关闭连接加密、信任服务端证书,跳过TLS握手校验环节。修改后的连接语句参考:
该方案无需修改服务端配置,也无需替换驱动文件,仅需调整代码连接参数即可生效。$dbSession = eval{ sql_init('xx.xxx.xxx.xx,port no','user','password',"database", { 'Encrypt' => 0, 'TrustServerCertificate' => 1 }) };
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

