使用 sqlcmd 连接到 SQL Server 时出现密码套件 TLS 1.2 握手错误

问题描述 投票:0回答:1

我正在尝试创建一个 Docker 容器来操作来自 SQL Server 的数据。

问题描述及涉及的设备

以下是相关设备的列表:

  • docker容器:操作系统是Debian 12。
  • 主机:Ubuntu 22.04。
  • SQL Server:版本为 2016 13.0.2026。在 Windows Server 2012R2 VM 上运行。不,我无法升级其中任何一个(我问过......)。

我使用完全相同的凭据(源自相同的 .env 文件以避免错误)。

我能够从主机通过 sqlcmd 连接(使用 sqlcmd v1.5.0、ODBC 17 和 openssl 3.0.2-0ubuntu1.18)。

我正在使用此命令从主机进行连接:

        sqlcmd \
        --server "$UTT_SQLDB_SERVERNAME" \
        --database-name "$UTT_SQLDB_DATABASE" \
        --user-name "$UTT_SQLDB_USERNAME" \
        --password "$UTT_SQLDB_PASSWORD"

但是从 docker 容器我不能(使用 sqlcmd 17.10.0001.1 Linux、ODBC 17 和 openssl 3.0.14-1~deb12u2):

我正在使用此命令从容器进行连接:

sqlcmd \
    -S "$UTT_SQLDB_SERVERNAME" \
    -U "$UTT_SQLDB_USERNAME" \
    -P "$UTT_SQLDB_PASSWORD" \
    -d "$UTT_SQLDB_DATABASE"

不存在防火墙问题,因为我可以从容器中 telnet 和 ping SQL Server。

错误信息

在容器上,我收到以下错误消息:

root@50f7a7519b2b:/var/www/html# sqlcmd -S $UTT_SQLDB_SERVERNAME -U $UTT_SQLDB_USERNAME -P $UTT_SQLDB_PASSWORD -d $UTT_SQLDB_DATABASE
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.

在 SQL Server 日志中我收到这两条错误消息(我从法语翻译过来):

TLS Error Code 40: This indicates a handshake failure during the TLS negotiation. It happens when the client and server cannot agree on the encryption protocols or ciphers.
SChannel Error 1205: This is a Windows error related to SChannel (Secure Channel), which is the component responsible for handling SSL/TLS encryption. Error 1205 generally means there was a mismatch in the TLS configuration between the client and the server.

我尝试过的事情

因为这似乎是一个密码套件问题,我尝试像这样直接与 openssl 连接(从容器):

root@50f7a7519b2b:/var/www/html# openssl s_client -connect $UTT_SQLDB_SERVERNAME:1433 -tls1_2
CONNECTED(00000003)
root@50f7a7519b2b:/var/www/html# openssl s_client -connect $UTT_SQLDB_SERVERNAME:1433 -tls1_1
CONNECTED(00000003)
root@50f7a7519b2b:/var/www/html# openssl s_client -connect $UTT_SQLDB_SERVERNAME:1433 -tls1  
CONNECTED(00000003)

而且它有效。这让我很困惑。

我也不明白为什么我能够从主机连接,但不能使用等效命令和类似的操作系统从容器连接?

我还尝试在主机网络模式下运行容器。没有运气。

sql-server docker ssl openssl
1个回答
0
投票

请在以下链接找到 SQL 2016 构建版本:

https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2016/build-versions

上述版本与上次 CU 及其他更新之间似乎存在显着差距。

Login-phase-errors 日志似乎与上面提到的 TLS 握手错误类似。

参考:https://learn.microsoft.com/en-us/sql/connect/ado-net/sqlclient-troubleshooting-guide?view=sql-server-2016#login-phase-errors

根据以下链接您应该更新 SQL Server

参考:https://learn.microsoft.com/en-us/sql/connect/ado-net/sqlclient-troubleshooting-guide?view=sql-server-2016#possible-reasons-and-solutions

© www.soinside.com 2019 - 2024. All rights reserved.