错误:
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate]. Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish connection. For solutions related to encryption errors, see https://go.microsoft.com/fwlink/?linkid=2226722
遇到这个错误通常是因为 SQL Server 客户端尝试与 SQL Server 建立安全连接时,无法验证服务器提供的证书。SQL Server 容器默认会生成一个自签名证书,而这个证书可能不会被客户端信任,导致连接失败。以下是几种解决方法:
方法 1: 禁用证书验证
对于开发或测试环境,你可以通过禁用证书验证来绕过这个问题。请注意,这种方法在生产环境中不推荐使用,因为它会降低安全性。
使用 sqlcmd
连接时禁用证书验证
sqlcmd -S localhost -U sa -P 'YourStrong!Passw0rd' -C
这里的 -C
参数告诉 sqlcmd
忽略证书验证错误。
方法 2: 使用自定义证书
为了提高安全性,你可以为 SQL Server 配置一个由受信任的 CA(证书颁发机构)签发的证书。
-
生成或获取证书:
- 你可以从一个受信任的 CA 获取证书,或者使用 OpenSSL 生成一个自签名证书。
-
将证书文件复制到 SQL Server 容器中:
- 使用
docker cp
命令将证书文件复制到容器中。
- 使用
-
配置 SQL Server 使用该证书:
- 进入容器内部,使用 SQL Server 配置管理器或其他工具配置 SQL Server 使用新的证书。
方法 3: 信任自签名证书
如果你使用的是自签名证书,可以将其添加到客户端的信任证书列表中。
-
导出自签名证书:
- 从 SQL Server 容器中导出自签名证书。你可以进入容器并使用
openssl
工具导出证书。
- 从 SQL Server 容器中导出自签名证书。你可以进入容器并使用
-
将证书导入客户端的信任存储:
- 在 Windows 上,你可以使用
certmgr.msc
导入证书。 - 在 Linux 上,你可以将证书添加到
/etc/ssl/certs
目录,并更新证书索引。
- 在 Windows 上,你可以使用
方法 4: 使用 mssql-conf
配置 SQL Server
如果你有权限访问 SQL Server 容器,可以使用 mssql-conf
工具来配置 SQL Server 的网络设置,包括证书。
-
进入容器:
docker exec -it sqlserver1 /bin/bash
-
运行
mssql-conf
/opt/mssql/bin/mssql-conf set network.ssl 0
方法 5: 使用环境变量配置 SQL Server
你也可以在启动容器时通过环境变量来配置 SQL Server 使用特定的证书。
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=YourStrong!Passw0rd' \
-e 'MSSQL_TLS_CERTIFICATE=/path/to/your/certificate.pem' \
-e 'MSSQL_TLS_KEY=/path/to/your/privatekey.pem' \
-p 1433:1433 --name sqlserver1 -d mcr.microsoft.com/mssql/server:2019-latest
这里的 MSSQL_TLS_CERTIFICATE
和 MSSQL_TLS_KEY
环境变量指定了证书和私钥的路径。