【问题标题】:A connection was successfully established... (provider: SSL Provider, error: 31 - Encryption( ssl /tls) handshake failed)连接已成功建立...(提供者:SSL 提供者,错误:31 - 加密(ssl / tls)握手失败)
【发布时间】:2022-10-20 14:35:30
【问题描述】:

我确实有一个用于代理 (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

    所有这些解决方案都没有任何效果。急需帮助!

【问题讨论】:

  • 通常,当公钥与私钥不匹配时,您会收到握手错误。你知道吗?
  • 您是否与 nginx 配置下的 ssl_certificate 有关?

标签: .net docker ssl dockerfile tls1.2


【解决方案1】:

我刚刚通过结合以下内容解决了我的担忧。

  • 使用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。在我的情况下不适用。

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2021-02-02
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多