我有一个用于代理(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
我尝试过的解决方案:
- 在数据库服务器的regedit中启用TLS 1.2
- 已重新启动SQL server代理
- 在连接字符串中添加了
TrustServerCertificate=True
或Encrypt=False
- 添加
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。就我而言,这是不适用的。