You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server连接SSL错误:自签证书CN与主机名不匹配求助

问题描述

我尝试用以下命令连接Microsoft SQL Server:

sqlcmd -S server.example.com\\instance_name,1433 -U $MSSQL_USER -P $MSSQL_PASSWORD -d mydatabase

最初报错:

Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate]

我通过nmap获取了SQL Server的证书:

nmap -v --script=ssl-cert -p 1433 server.example.com

返回结果显示证书的commonName=SSL_Self_Signed_Fallback:

1433/tcp open  ms-sql-s
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-06-16T10:20:00
| Not valid after:  2054-06-16T10:20:00
| MD5:   <somethinghere>
| SHA-1: c3aa8d4443a5e8f6a9f6cbaedc888d9b28d77b49
| -----BEGIN CERTIFICATE-----

之后我把证书添加到Debian 12的信任列表:

cp mycert.crt /usr/local/share/ca-certificates
update-ca-certificates

现在又出现新报错:

Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:subject name does not match host name].

请问这是不是因为自签证书的commonName没设为server.example.com,而SSL验证要求证书CN和主机名一致,导致没法用其他方式解决?

注:我知道加-C参数可以默认信任证书,但不想这么做,希望安全地信任该证书,避免中间人攻击。


解答

你的判断完全正确——当前报错的核心原因就是自签证书的commonName(SSL_Self_Signed_Fallback)和你连接时使用的主机名(server.example.com)不匹配,SSL/TLS的身份验证机制会严格校验这一点,防止中间人攻击。

要安全解决这个问题,有两种合规的方案:

方案1:重新生成匹配主机名的自签证书

在SQL Server上生成包含正确主机名的自签证书:

  1. 用PowerShell或证书管理工具创建新的自签证书,确保Subject的commonName设置为server.example.com,同时建议添加Subject Alternative Name(SAN)字段包含该主机名(现代SSL验证更优先校验SAN)。
  2. 在SQL Server配置管理器中,将新证书绑定到SQL Server的SSL端口(1433)。
  3. 将新证书导出并添加到Debian客户端的信任证书列表,重新执行update-ca-certificates。

方案2:客户端强制指定信任该证书(无需修改服务器证书)

如果无法修改服务器证书,可以通过ODBC配置指定仅信任这个特定证书,同时绕过主机名校验(但仅针对该证书,依然能避免中间人攻击):

  1. 创建或修改ODBC数据源配置文件(比如~/.odbc.ini),添加以下配置项:
[MyMSSQL]
Driver=ODBC Driver 18 for SQL Server
Server=server.example.com\\instance_name,1433
Database=mydatabase
UID=$MSSQL_USER
PWD=$MSSQL_PASSWORD
TrustServerCertificate=no
Certificate=/path/to/mycert.crt
  1. 使用该数据源连接:
sqlcmd -D -SN MyMSSQL

这种方式会强制客户端验证指定的证书,即使CN不匹配,也能确保只有持有对应私钥的服务器才能通过验证,不会引入全局安全风险。

内容的提问来源于stack exchange,提问作者erni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:40:18