我更新了我的应用程序从。net Core 3.1到。net 5,现在我不能打开连接到我的SQL Server数据库。最里面的异常错误消息是
从传输流收到一个意外的EOF或0字节。
顶级错误消息是
与服务器成功建立连接,但在登录前握手时发生错误。(provider: SSL provider, error: 31 - Encryption(SSL/tls) handshake failed)
除了。net 5的版本,我只更新了基本图像,从3.1-bionic
到5.0.3-focal-amd64
还有什么我应该做的吗?
编辑1:
我发现这篇文章似乎与我正在阅读的内容密切相关。但是在将我的CipherString
更改为建议的值后,我没有改变错误。同样的事情。也许有一个CipherString = ANY
?
说明
microsoft建议通过升级SQL server以支持TLS v1.2来提高安全性
参:
- SqlClient故障诊断指南 如何启用TLS 1.2
- KB3135244 - TLS 1.2支持Microsoft SQL Server
但是,如果您无法升级您的SQL Server以支持TLS v1.2,您可以通过编辑/etc/ssl/openssl.cnf
文件来影响可用的密码套件以实现客户端协议的降级。
因为Alpine容器是简单的,所以首先安装您喜欢的编辑器,例如:
apt-get update
apt-get install nano
编辑/etc/ssl/openssl.cnf
,将以下行放在文件的开头:
openssl_conf = default_conf
和文件末尾的以下行:
########## Override default settings to enable TLS v1.0 and 1.1 ##########
[ default_conf ]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=1
#It really should be:
#CipherString = DEFAULT:@SECLEVEL=2
这将影响容器中所有启用openssl的进程。您可以使用以下命令在更改前后测试连接性:
# Test TLS v1.0 connectivity
openssl s_client -host google.com -port 443 -tls1
# Test TLS v1.1 connectivity
openssl s_client -host google.com -port 443 -tls1_1