zoukankan      html  css  js  c++  java
  • 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, 或者升级更高的版本. (这显然不现实......)

  • 相关阅读:
    tcl基本语法
    linux hostid与lmhostid
    linux下uptime命令
    介绍一下 WebApplicationContext?
    Spring 由哪些模块组成?
    怎样开启注解装配?
    解释不同方式的自动装配 ?
    @Qualifier 注解有什么用?
    解释 Spring 框架中 bean 的生命周期?
    如何在 spring 中启动注解装配?
  • 原文地址:https://www.cnblogs.com/eastpig/p/13375402.html
Copyright © 2011-2022 走看看