我尝试连接旧版 SqlServer,但由于 TLS 握手错误导致连接失败。使用 Wireshark 分析流量后,我似乎找到了原因:证书使用算法 ID: 1.2.840.113549.1.1.5
( sha1WithRSAEncryption
) 签名。因此,如果客户端表示rsa_pkcs1_sha1 (0x0201)
支持(使用signature_algorithms
Client Hello 中的扩展),服务器会正确响应(已在 Windows 上测试),否则服务器会立即关闭连接。但是我没能使用 openssl 3 启用它。TLS
版本:1.2
我尝试过的:
- 设置 SECLEVEL=0 (
CipherString = ALL@SECLEVEL=0
) - 添加了在成功连接测试中被接受的 CypherSuites(例如
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c))
- 确保旧式提供程序已加载并处于活动状态(使用
openssl list -providers
) - 在 SignatureAlgorithms 中明确添加了所需的算法。但不确定我是否做对了。像这样:
SignatureAlgorithms = RSA+SHA1:ecdsa_sha1:rsa_pkcs1_sha1:...
config_diagnostics = 1
- 确保 RSA 和 SHA1 可在不同的环境中使用(
openssl dgst -sha1 ./file.txt
,openssl genrsa
)
当 TLS 握手启动时,所有与 SHA1 相关的内容都会从 signature_algorithms 扩展中跳过,因此服务器会关闭连接。
此外,出于某种原因,openssl list -digest-algorithms
打印的sha1WithRSAEncryption => SHA1
是Legacy
部分,而不是Provided
部分。从文档中我不清楚这些部分是什么意思
openssl 版本:3.2.2
PS 请记住,我不熟悉 CypherSuites、签名算法等,也不知道它们会如何相互影响。只是尝试连接到服务器。
PS 2. 请不要告诉我 SHA1 不安全,并且我需要在不属于我的服务器上更新证书。