已成功建立连接..(提供程序:SSL提供程序,错误:31-加密(SSL/tls)握手失败)



我有一个用于代理(nginx(、用户界面和API(.NET 6(的docker容器。API给我一个错误A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 31 - Encryption( ssl /tls) handshake failed)

部署环境:CentOS 7

SQL Server版本:Microsoft SQL 2016 SP2

连接字符串:Data Source=${DB_HOST};Initial Catalog=${DB_NAME};Persist Security Info=True;User ID=${DB_USERNAME};Password=${DB_PASSWORD};MultipleActiveResultSets=True

我尝试过的解决方案:

  1. 在数据库服务器的regedit中启用TLS 1.2
  2. 已重新启动SQL server代理
  3. 在连接字符串中添加了TrustServerCertificate=TrueEncrypt=False
  4. 添加RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf

所有这些解决方案都无效。急需帮助!

我刚刚通过结合以下内容解决了我的问题。

  • 使用Microsoft.Data.SqlClient而不是Systems.Data.SqlClient
  • 添加命令到API的Dockerfile

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

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

  • TrustServerCertificate=True添加到数据库的连接字符串中

这将docker映像或容器的TLS版本降低到TLSv1。然而,这不是最好的解决方案。最好升级SQL服务器以允许连接接受TLSv1.2。就我而言,这是不适用的。

最新更新