使用pyodbc连接SQL Server 2012遇SSL协议不支持错误求助
解决Ubuntu 22.04用pyodbc连接SQL Server 2012的SSL协议错误
错误原因
SQL Server 2012默认仅支持TLS 1.0/1.1(未打SP3及以上补丁时),而ODBC Driver 18 for SQL Server默认要求更高版本的TLS协议,即便设置Encrypt=no,驱动仍可能尝试建立SSL握手,最终因协议不兼容触发报错。
解决方案
方案1:改用ODBC Driver 17 for SQL Server
Driver 17对旧版SQL Server兼容性更好,无需调整数据库配置,仅需修改连接字符串:
'DRIVER={ODBC Driver 17 for SQL Server};SERVER=<ip>\<instance>,1433;DATABASE=<db_name>;UID=sa;PWD=<db_psw>;Encrypt=no'
先确认Ubuntu上已安装Driver 17,可通过以下命令安装:
sudo apt-get install msodbcsql17
方案2:保留Driver 18,调整TLS协议支持
步骤1:升级SQL Server 2012支持TLS 1.2
SQL Server 2012需安装**Service Pack 3 (SP3)**及后续累积更新,才能支持TLS 1.2。安装补丁后,在数据库服务器(Windows系统)的注册表中启用TLS 1.2:
- 打开注册表编辑器,导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.<你的实例名>\MSSQLServer\SuperSocketNetLib - 新建DWORD值
TLS12,设置数值为1 - 重启SQL Server服务
步骤2:确认Ubuntu 22.04启用TLS 1.2
Ubuntu 22.04默认启用TLS 1.2,无需额外配置;若仍有问题,可检查系统SSL配置文件/etc/ssl/openssl.cnf,确保TLS 1.2在允许协议列表中。
方案3:Ubuntu端启用旧TLS协议(不推荐,安全性低)
若无法升级SQL Server补丁,可临时在Ubuntu上启用TLS 1.0/1.1:
- 编辑
/etc/ssl/openssl.cnf,在[openssl_init]下添加:ssl_conf = ssl_sect - 在文件末尾添加:
[ssl_sect] system_default = system_default_sect [system_default_sect] MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1 - 重启应用或系统生效
总结
优先推荐方案1(改用Driver 17),操作最简单且兼容性好;若必须使用Driver 18,优先升级SQL Server补丁启用TLS 1.2,避免启用旧协议带来的安全风险。
内容的提问来源于stack exchange,提问作者prodoreda
相关产品推荐
相关产品推荐

