如何在R语言中使用DBI包禁用ODBC连接的SSL加密?
解决ODBC Driver 18连接SQL Server 2014的SSL协议不兼容问题
核心问题原因
ODBC Driver 18 for SQL Server默认强制启用加密,且默认禁用了TLS 1.0/1.1这类旧协议;而SQL Server 2014默认仅支持TLS 1.0/1.1,导致握手时出现协议不支持的错误。同时你需要明确禁用SSL认证,需调整连接参数或Driver配置。
解决方法
方法1:调整ODBC Driver 18的连接参数与系统配置
步骤1:修改R连接代码
取消注释TrustServerCertificate = "yes",确保Encrypt = "no"生效,完整连接代码如下:
library(dplyr) library(dbplyr) library(odbc) library(DBI) DBI_Connection <- dbConnect(odbc(), Encrypt = "no", TrustServerCertificate = "yes", Driver = "ODBC Driver 18 for SQL Server", server = "192.168.0.240", database = "database", uid = "user", pwd = "pass", Port = 1433) test <- tbl(DBI_Connection, "I07_PARD") glimpse(test)
步骤2:配置Driver允许旧TLS协议
根据你的操作系统调整:
- Windows:
打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ODBC Driver 18 for SQL Server,添加两个DWORD值:DisableCertificateVerification:设为1TLSProtocol:设为0x0000000A(允许TLS 1.0和TLS 1.1)
- Linux/macOS:
修改odbcinst.ini文件(路径通常为/etc/odbcinst.ini或~/.odbcinst.ini),在[ODBC Driver 18 for SQL Server]小节添加:TLSProtocol=TLSv1.0,TLSv1.1
方法2:改用ODBC Driver 17 for SQL Server
ODBC Driver 17默认不强制加密,对SQL Server 2014兼容性更好,无需额外系统配置。只需修改连接代码中的Driver名称:
DBI_Connection <- dbConnect(odbc(), Encrypt = "no", Driver = "ODBC Driver 17 for SQL Server", server = "192.168.0.240", database = "database", uid = "user", pwd = "pass", Port = 1433)
可选:服务器端升级TLS版本(推荐长期方案)
如果需要保留加密功能,可给SQL Server 2014安装SP2及以上补丁,然后在服务器端启用TLS 1.2,这样ODBC Driver 18就能正常使用加密连接,无需兼容旧协议。
内容的提问来源于stack exchange,提问作者Lukas Kondrusevičius
相关产品推荐
相关产品推荐

