# 背景说明
最近用NET5开发了一个小程序,连接SQL SERVER数据库,并查询一些数据,具体的功能不重要。开发时,测试用的自己的SQL SERVER2019测试,运行正常后,就进行打包发布了。然后丢给同事去部署,起初的部署也很顺利,但是后面开始出现了问题,数据库无法连接。
# 错误情况和排查过程
docker 镜像打包用的基础镜像是mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim,是微软官方的镜像,容器在运行时,刚开始的错误是 A connection was successfully established with the server, but then an error occurred during the pre-login handshake.(provider:TCP Provider,error:35),看错误提示,是协议协商过程中的握手出错了,于是先百度了一圈,得到大概的结果应该是TLS协议的版本问题,NET5中的SqlClient使用了TLSv1.2来连接数据库,而早期的SQL SERVER使用的是TLSv1.0协议,导致了连接出现错误。
根据大神的提示,将容器中 /etc/ssl/openssl.conf文件中的TLSv1.2改为TLSv1.0,SECLEVEL改为1,程序依然无法正常连接SQL SERVER数据库,但是提示的内容发生了变化,错误内容如下:A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption