记一次SSMS连接SQL报错10054解决

AzureDataFactory连接SQLServerTLS兼容性问题解决方案
文章讲述了AzureDataFactory在连接on-premisesSQLServer时遇到的10054错误,经排查发现是由于TLS版本不匹配。通过修改客户端组策略,移除TLS_DHE密码套件解决了问题,强调了定期更新系统补丁的重要性。

前两天碰到了一个诡异的问题,Azure Data factory通过integration runtime连接on-premise sql server提示SqlErrorNumber=10054

服务器端Windows Server是2012R2,SQL server版本2012 - 11.0.5058.0

客户端是Server 2022最新Patch

具体报错错如下: 

Cannot connect to SQL Database. Please contact SQL server team for further support. Server: ' ', Database: ' ', User: ' '. Check the linked service configuration is correct, and make sure the SQL Database firewall allows the integration runtime to access.
A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - An existing connection was forcibly closed by the remote host.), SqlErrorNumber=10054,Class=20,State=0,
An existing connection was forcibly closed by the remote host 

然后在客户端用SQL Server Management Studio测试连接也是相同的报错:

查报错代码微软相关文档解释说是TLS不匹配,TLS 1.0/1.1已经被禁用了,需要升级server端的sql的patch以支持TLS1.2,但是碍于是客户的生产环境不方便升级,而且后面安装了客户端测试机一模一样Patch却可以正常连接,说明不是这个问题,本来想等到停机窗口升级SQL了再说,好在最后找到方法了,只通过修改客户端组策略解决

在客户机运行gpedit.msc   打开有问题的客户端的组策略,

找到 计算机配置 -> 管理模板 -> 网络 -> SSL 配置设置-> SSL密码套件顺序,把

TLS_DHE_*  开头的密码套件删除,重启客户机问题解决

微软的解释是某些windows版本之后使用TLS_DHE密码套件会在密钥前加0,而之前的windows则不会,组策略中的这个密码套件顺序如果不设置的话貌似是随机使用密码套件(所以这就是为啥装了另一台一模一样的客户端却好好的原因),当某些情况下用到TLS_DHE密码套件时,两边不匹配导致无法正常连接,可以升级OS的Patch解决也可以在客户端上修改套件顺序解决。

还是建议多多更新Patch吧😂

微软的说明:https://learn.microsoft.com/zh-cn/troubleshoot/windows-server/identity/apps-forcibly-closed-tls-connection-errors

### 关于 Navicat Premium 连接 SQL Server 数据库时出现错误 2003 的解决方案 当使用 Navicat Premium 连接SQL Server 数据库时遇到错误 2003,通常表示无法建立到主机的连接。这可能是由于网络设置、SQL Server 配置或其他环境因素引起的。 以下是可能的原因及其对应的解决方法: #### 1. **检查 SQL Server 是否已启动** 如果 SQL Server 服务未运行,则客户端程序(如 Navicat)将无法与其通信。需要确认 SQL Server 已正确启动并正在监听指定端口上的请求[^2]。 - 打开 `SQL Server 配置管理器`。 - 转至 `SQL Server 服务` 并验证目标实例的服务状态是否为“正在运行”。如果没有,请右键单击该服务并选择“启动”。 #### 2. **验证防火墙设置** 某些情况下,Windows 或其他安全软件中的防火墙可能会阻止外部访问 SQL Server 使用的默认端口 (通常是 TCP 1433)[^4]。 - 确认 Windows 防火墙允许通过此端口进行入站流量。 - 如果启用了第三方防火墙或路由器 ACL 设置,请确保它们也开放了相应的端口号。 #### 3. **启用 TCP/IP 协议支持** 为了使远程计算机能够成功连接上您的 SQL Server 实例,必须激活其 TCP/IP 支持功能: - 在 `SQL Server 配置管理器 -> 网络配置 -> Protocols for MSSQLSERVER` 中找到 “TCP/IP”,将其属性更改为 Enabled。 - 同样在此界面下的 IP 地址选项卡中查找绑定地址部分,保证至少有一个 IPv4/IPv6 条目被设定了活动状态以及指派了一个有效的静态端口号(推荐保持默认值即1433)。 #### 4. **调整登录认证方式** Navicat 可能因为身份验证模式冲突而拒绝接入。尝试切换成混合模式(Mixed Mode),这样既接受 Windows Authentication 又兼容 SQL Server Authentication 登录形式[^1]: - 利用 SSMS 修改服务器的安全策略; - 将当前仅限 WinAuth 的设定更改过来即可满足多场景需求。 #### 5. **重新安装 ODBC Driver / Client Components** 有时原生驱动存在问题或者版本不适配也会引发此类异常状况。建议卸载现有组件后再下载最新版 Microsoft 提供的相关资源完成重装过程: https://docs.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16 按照官方文档指引操作完毕之后再次测试链接情况看是否有改善迹象。 ```python import pyodbc conn_str = ( r'DRIVER={ODBC Driver 17 for SQL Server};' r'SERVER=localhost;' r'DATABASE=testdb;' r'UID=user_name;' r'PWD=password;' ) try: conn = pyodbc.connect(conn_str) except Exception as e: print(e) finally: if 'conn' in locals(): conn.close() ``` 以上脚本可以用来初步排查 Python 应用层面上是否存在类似的连通障碍问题。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值