Linux平台OpenSSL 3环境下无法连接使用SHA1+RSA签名证书的遗留SQL Server(TLS 1.2)
Linux平台OpenSSL 3环境下无法连接使用SHA1+RSA签名证书的遗留SQL Server(TLS 1.2)
我最近碰到一个棘手的连接问题:要对接一台遗留的SQL Server,但每次尝试连接都会因为TLS握手失败而失败。用Wireshark抓包分析后,终于定位到了根源——这台SQL Server的证书使用的签名算法是1.2.840.113549.1.1.5(也就是sha1WithRSAEncryption)。
进一步测试发现,只有当客户端在TLS Client Hello的signature_algorithms扩展里明确声明支持rsa_pkcs1_sha1 (0x0201)时,服务器才会正常响应握手请求(我在Windows平台上测试是可以成功连接的);如果客户端没声明这个算法支持,服务器会直接断开连接。但我在Linux的OpenSSL 3环境下,试了好几种方法都没法让客户端带上这个签名算法的支持,导致一直连不上。
注:使用的TLS版本是1.2
我已经尝试过的方法
- 把OpenSSL配置里的
SECLEVEL设为0:CipherString = ALL@SECLEVEL=0 - 添加了之前Windows上成功连接时使用的加密套件,比如
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c) - 确认legacy provider已经加载并激活(用
openssl list -providers命令验证过) - 尝试在配置里显式添加想要的签名算法,比如设置
SignatureAlgorithms = RSA+SHA1,但不确定配置是否正确
解决方法
在OpenSSL 3中,要启用rsa_pkcs1_sha1这类遗留签名算法,光设置SECLEVEL=0可能不够,需要确保legacy provider被正确启用,并且在配置里明确指定签名算法列表,把RSA+SHA1加进去。
具体可以这么修改openssl.cnf配置文件:
- 首先在
[provider_sect]部分确保legacy provider被启用:
[provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1
- 然后在
[ssl_default_sect](或者对应的SSL配置段)里,明确设置签名算法和加密套件:
[ssl_default_sect] MinProtocol = TLSv1.2 CipherString = ALL@SECLEVEL=0 SignatureAlgorithms = rsa_pkcs1_sha1,rsa_pkcs1_sha256,rsa_pkcs1_sha384,rsa_pkcs1_sha512
这里把rsa_pkcs1_sha1放在签名算法列表的前面,确保客户端优先声明这个算法支持。
- 如果你的应用是通过环境变量指定配置文件的,可以设置
OPENSSL_CONF=/path/to/your/openssl.cnf,然后重启应用再尝试连接。
另外,也可以通过命令行临时测试,比如用openssl s_client命令来验证是否能正常握手:
openssl s_client -connect your-sql-server-host:1433 -tls1_2 -sigalgs rsa_pkcs1_sha1 -cipher ALL@SECLEVEL=0 -provider legacy -provider default
如果这个命令能成功建立连接,说明配置是正确的,再把对应的配置应用到你的应用程序里即可。
备注:内容来源于stack exchange,提问作者shameleo
相关产品推荐
相关产品推荐

