Ubuntu 20.04 PHP7.4 Laravel连接SQL Server报错0x2746 加密套件不匹配
错误原因
这是Ubuntu 20.04默认OpenSSL安全策略与Windows服务器上SQL Server支持的TLS 1.2加密套件不匹配导致的连接握手失败:
- Ubuntu 20.04默认OpenSSL安全等级为2,禁用了所有安全强度低于112位的加密套件
- 目标Windows服务器的SQL Server仅支持被Ubuntu默认策略禁用的旧款TLS 1.2加密套件,双方无法协商出可用的加密方案,导致连接中断
解决方案(按优先级尝试)
方案1:调整Ubuntu OpenSSL全局安全策略(90%以上场景可解决)
- 编辑OpenSSL配置文件:
sudo nano /etc/ssl/openssl.cnf
- 找到文件末尾的
[system_default_sect]配置段,修改参数:
# 原配置 CipherString = DEFAULT@SECLEVEL=2 # 修改为 CipherString = DEFAULT@SECLEVEL=1
- 保存退出后,重启对应的服务使配置生效:
# 若用PHP-FPM + Nginx sudo systemctl restart php7.4-fpm sudo systemctl restart nginx # 若用Apache sudo systemctl restart apache2
- 测试Laravel数据库连接,确认是否恢复正常。
方案2:调整Windows服务器SQL Server的加密套件优先级
如果不想修改Ubuntu的全局安全策略,可在Windows服务器侧配置:
- 确认SQL Server版本已安装TLS 1.2支持补丁(SQL Server 2012及更早版本需要单独安装对应补丁,2016及以后版本默认支持)
- 使用系统加密配置工具调整TLS 1.2加密套件优先级,将以下Ubuntu兼容的套件移到优先级前列:
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_RSA_WITH_AES_256_GCM_SHA384
- TLS_RSA_WITH_AES_128_GCM_SHA256
- 重启Windows服务器生效后再测试连接。
临时验证方案(仅测试用,不建议生产环境使用)
如果仅需快速确认是否为加密套件导致的问题,可先在Laravel的数据库配置中临时关闭加密验证:
打开config/database.php,找到sqlsrv连接配置段,新增options参数:
'sqlsrv' => [ // 其他原有配置保持不变 'options' => [ PDO::SQLSRV_ATTR_ENCRYPT => PDO::SQLSRV_ENCRYPT_OFF, ], ],
保存后测试连接,若能正常访问则可确认是加密协商问题,再按方案1或2正式修复。
验证方法
配置完成后可先在Ubuntu命令行用sqlcmd工具验证连接:
sqlcmd -S <SQL服务器地址>,<端口> -U <用户名> -P <密码>
若能正常进入SQL交互命令行,说明连接配置已生效。
内容的提问来源于stack exchange,提问作者naif basalib
相关产品推荐
相关产品推荐

