我正在尝试创建一个 Docker 容器来操作来自 SQL Server 的数据。
以下是相关设备的列表:
我使用完全相同的凭据(源自相同的 .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 2016 构建版本:
https://learn.microsoft.com/en-us/troubleshoot/sql/releases/sqlserver-2016/build-versions
上述版本与上次 CU 及其他更新之间似乎存在显着差距。
Login-phase-errors 日志似乎与上面提到的 TLS 握手错误类似。
根据以下链接您应该更新 SQL Server