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上生成包含正确主机名的自签证书:
- 用PowerShell或证书管理工具创建新的自签证书,确保
Subject的commonName设置为server.example.com,同时建议添加Subject Alternative Name(SAN)字段包含该主机名(现代SSL验证更优先校验SAN)。 - 在SQL Server配置管理器中,将新证书绑定到SQL Server的SSL端口(1433)。
- 将新证书导出并添加到Debian客户端的信任证书列表,重新执行
update-ca-certificates。
方案2:客户端强制指定信任该证书(无需修改服务器证书)
如果无法修改服务器证书,可以通过ODBC配置指定仅信任这个特定证书,同时绕过主机名校验(但仅针对该证书,依然能避免中间人攻击):
- 创建或修改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
- 使用该数据源连接:
sqlcmd -D -SN MyMSSQL
这种方式会强制客户端验证指定的证书,即使CN不匹配,也能确保只有持有对应私钥的服务器才能通过验证,不会引入全局安全风险。
内容的提问来源于stack exchange,提问作者erni

