EF Core 3.1 in Docker暴异常:An error occurred during the pre-login handshake

环境

.net core: 3.1

sqlserver version: Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)

ef core: 3.1

ef provider: sql server

docker: 19.0.3

my app dockerfile from: FROM mcr.microsoft.com/dotnet/core/runtime:3.1

复现步骤

1. 当代码中尝试通过ef context读取数据时(连续一定请求之后), 会报如下错误:

image

2. 在本机windows环境下无错, 但是在容器中会报错

调查

1. 找到了相关问题链接: https://github.com/dotnet/SqlClient/issues/222

2. 之所以爆这个错是因为, 我用的微软基础镜像是基于debain的, 镜像中默认的tls协议版本要求是1.2, 而我的sql server服务器所支持的是1.0

镜像中tls版本:

image

我sql server生产环境的版本,所对应的tls support对照, 所有版本支持请点击我:

image

从上图可以看出, 他是从10.50.6542.0及其之后的版本,才支持tls1.2, 而我生产环境是10.50.6000.34 ,小了一个版本,所以不支持.

所以你容器中minprotocol要求是1.2, 但是server端不允许, 所以理所当然的会暴上面openssl错误.

修复

方法一: 在基础镜像中, 添加如下命令, 重新buid即可:

FROM mcr.microsoft.com/dotnet/core/runtime:3.1

RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf


巴拉巴拉~~~~

(可以在容器运行起来后, 再次使用上面命令来查看下有没有变成1.0)

方法二: 给生产sql server 按照官方文档打上kb, 或者升级更高的版本. (这显然不现实......)

猜你喜欢

转载自www.cnblogs.com/eastpig/p/13375402.html