Ubuntu 24.04无法连接Windows 2012上SQL Server 2016的问题求助
排查Ubuntu 24.04通过ODBC Driver 18连接SQL Server 2016(Windows 2012)失败问题
错误核心分析
你遇到的0x2746错误属于TCP Provider的SSL握手失败,本质是客户端(Ubuntu 24.04 + OpenSSL 3.0)与服务器(Windows 2012 + SQL Server 2016)的SSL/TLS协议版本或加密套件不兼容。
具体排查步骤
1. 检查SQL Server 2016的TLS配置
Windows 2012和SQL Server 2016默认可能未启用TLS 1.2(或仅启用了旧版本TLS 1.0/1.1),而ODBC Driver 18默认要求TLS 1.2及以上版本:
- 登录Windows 2012服务器,打开注册表编辑器(
regedit) - 定位路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols - 确认
TLS 1.2项存在,且其下Client和Server子项的Enabled值设为1,DisabledByDefault设为0 - 若缺失,手动创建这些项并设置对应值,重启服务器生效
2. 调整ODBC连接字符串的TLS参数
在连接字符串中显式指定TLS版本,强制匹配服务器支持的协议:
isql -v -k 'DRIVER=ODBC Driver 18 for SQL Server;Server=<SERVER>;UID=<USER>;PWD=<PASSWORD>;Database=<DATABASE>;ColumnEncryption=No;TrustServerCertificate=yes;Encrypt=yes;TLSVersion=TLS1.2'
若服务器仅支持TLS 1.1,可尝试将
TLSVersion设为TLS1.1,但不推荐长期使用,建议优先升级服务器TLS配置。
3. 调整OpenSSL 3.0兼容性设置
OpenSSL 3.0默认禁用部分旧加密套件,可能与Windows 2012的SCHANNEL不匹配:
- 临时测试:执行
isql前设置环境变量放宽限制:
export SSL_CIPHERS="DEFAULT@SECLEVEL=1" isql -v -k 'DRIVER=ODBC Driver 18 for SQL Server;Server=<SERVER>;UID=<USER>;PWD=<PASSWORD>;Database=<DATABASE>;ColumnEncryption=No;TrustServerCertificate=yes'
- 若临时生效,可修改
/etc/ssl/openssl.cnf,找到[system_default_sect]段调整为:MinProtocol = TLSv1.2 CipherString = DEFAULT@SECLEVEL=1
4. 验证基础网络连通性
先排除网络层面问题:
- 在Ubuntu机器执行
telnet <SERVER> 1433,确认SQL默认端口可达 - 检查Windows 2012防火墙是否允许Ubuntu机器IP访问1433端口
- 确认SQL Server配置管理器中,TCP/IP协议已启用且监听端口为1433
5. 降级ODBC驱动(备选方案)
若上述调整无效,可尝试降级到ODBC Driver 17(对旧TLS版本兼容性更好):
# 卸载ODBC 18 sudo apt remove msodbcsql18 # 安装ODBC 17 sudo apt install msodbcsql17
然后用原连接字符串测试连接。
内容的提问来源于stack exchange,提问作者karlk
相关产品推荐
相关产品推荐

