我花了几天时间在谷歌上寻找解决方案,但没有找到正确的解决方案。所以我把它发布在这里。
我有 3 台 VM 机器。
VM 1:
Windows Server 2012 R2 SP1,192.168.1.10
SQL Server 2016,端口 1432
SQL Server 2017,端口 1433
虚拟机 2:
ubuntu 20.04
openssl 1.1.1p
虚拟机 3:
ubuntu 22.04
openssl 3.0.2
在 VM2(ubuntu 20.04)上:
连接到 sql server 2016
sqlcmd -S 192.168.1.10,1432 -U test -P 测试
成功连接
连接到 sql server 2017
sqlcmd -S 192.168.1.10,1433 -U test -P 测试
成功连接
在 VM3(ubuntu 22.04)上:
连接到 sql server 2017
sqlcmd -S 192.168.1.10,1433 -U test -P test
成功连接
连接到 sql server 2016
sqlcmd -S 192.168.1.10,1432 -U test -P test
获取错误:
Sqlcmd:错误:SQL Server 的 Microsoft ODBC 驱动程序 17:TCP 提供程序:错误代码 0x2746。Sqlcmd
:错误:SQL Server 的 Microsoft ODBC 驱动程序 17:客户端无法建立连接。
然后我检查 VM1 上的 sql server 2016 日志,发现 2 个错误:
事件 ID:36888
生成了致命警报并发送到远程端点。这可能会导致连接终止。TLS 协议定义的致命错误代码为 40。Windows SChannel 错误状态为 1205。
事件 ID:36874
从远程客户端应用程序收到了 TLS 1.2 连接请求,但客户端应用程序支持的任何密码套件均不受服务器支持。SSL 连接请求失败。
我尝试过的:
1、修改/etc/ssl/openssl.cnf
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1
2、降级openssl到1.1.1p
3、修改win服务器reg
HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2
键值:Enabled Value:1
4、执行windows更新
我尝试了所有能找到的关于“TCP 提供程序:错误代码 0x2746”的建议,但没有一个适合我的情况。
当我们在 ubuntu 22.04 和 openssl 3.0.2 中使用 sqlcmd 到 ms sql server 2016 时,就会出现此问题
有什么想法?有什么建议?有什么解决方案?
答案1
Ubuntu 22.04
制作 openssl.cnf 文件 例如) /usr/local/ssl/openssl.cnf
openssl_conf = openssl_init
[openssl_init]
providers = provider_sect
ssl_conf = ssl_sect
[provider_sect]
default = default_sect
legacy = legacy_sect
[default_sect]
activate = 1
[legacy_sect]
activate = 1
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = ALL:@SECLEVEL=0
使用旧版 TLSv1 ubuntu 22.04 openssl3 运行 nagstamon
和export OPENSSL_CONF=/usr/local/ssl/openssl.cnf
Ubuntu 20.04
制作 openssl.cnf 文件 例如) /usr/local/ssl/openssl.cnf
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = ssl_default_sect
[ssl_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=1
Ubuntu 20.04 - 如何设置较低的 SSL 安全级别?
和export OPENSSL_CONF=/usr/local/ssl/openssl.cnf
答案2
您还可以向 systemd 添加设置 OPENSSL_CONF 环境变量:
创建目录/etc/systemd/system/php8.1-fpm.service.d
创建一个disable_SSL_SECLEVEL=2.conf文件内容
[服务]
环境=“OPENSSL_CONF=/usr/local/ssl/openssl.cnf”
跑步
$ sudo systemctl 守护进程重新加载
$ sudo 重启 php8.1-fpm