GO-MSSQLDB 加密与证书

go-mssqldb驱动支持多种加密模式和证书验证策略,用于连接SQL Server和Azure SQL。 本文将介绍每种加密模式、如何配置证书验证,以及何时使用TDS 8.0严格模式。

选择TLS配置

在调整单个参数之前,请使用这张表格选择最适合你环境的最安全方案。

情景 推荐设置 为什么
Azure SQL 或 SQL Server 2022 及以后版本,你想要最强的默认保护 encrypt=strict TDS 8.0 会先进行 TLS 握手,再进行 TDS 协商,并且始终验证证书。
服务器证书链连接到可信的公共或企业CA encrypt=true 当主机名称和信任链已经正确时,标准证书验证通常就足够了。
服务器使用的私有 CA 不在系统信任存储中 encrypt=true&certificate=/path/to/ca-cert.pem 将CA证书添加到自定义信任池中,并保持正常链验证。
服务器使用自签名证书,而你希望进行证书固定 encrypt=true&serverCertificate=/path/to/server.pem 逐字节比较确切的服务器证书,而不是依赖 CA 证书链。
仅限本地开发或临时测试环境 encrypt=true&TrustServerCertificate=true 保持加密,但跳过服务器身份验证。 不要在生产环境中使用这个设置。

加密模式

将连接参数设置为 encrypt 以下值之一:

价值 Behavior
strict TDS 8.0加密。 TLS握手发生在TDS连接谈判之前。 需要SQL Server 2022或Azure SQL。
truemandatory TDS预登录握手后,连接会被加密。
falseoptional 加密仅在服务器需要时使用。 当未指定 encrypt 时,这是默认值。 Azure SQL 总是需要服务器端加密,因此无论设置如何,连接 Azure SQL 都会被加密。
disable 无加密。 不建议用于生产。

Example

通过使用encrypt参数在 连接字符串 中启用加密:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true

证书验证

当你启用加密(encrypt=trueencrypt=strict),驱动会验证服务器证书,除非你设置 TrustServerCertificate=true了。 存在两种独立的验证方法。

通过使用参数 certificate 进行链式验证

提供PEM或DER证书文件。 驱动程序将证书添加到自定义信任池,并对该信任池执行标准的X.509链验证:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&certificate=/path/to/ca-cert.pem

使用参数 serverCertificate 进行字节级比较

注释

serverCertificate 参数在驱动 v1.9.6 中引入。

提供包含服务器证书的PEM或DER文件。 驱动程序逐字节比较服务器的证书字节与提供的文件。 驱动不执行链验证。 这种方法适用于自签名证书:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&serverCertificate=/path/to/server.pem

主机名替代

默认情况下,驱动程序会验证证书的通用名称(CN)或主题替代名称(SAN)是否与服务器主机名称匹配。 使用 hostnameincertificate 可覆盖预期的主机名:

sqlserver://<user>:<password>@10.0.0.5:1433?database=AdventureWorks2025&encrypt=true&hostnameincertificate=<server>.domain.com

跳过证书验证

TrustServerCertificate=true 设为跳过所有证书验证。 连接仍然加密,但服务器身份未被验证:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=true

注意

设置 TrustServerCertificate=true 会使连接暴露于中间人攻击。 请仅将此选项用于开发和测试。

TDS 8.0 严格模式

TDS 8.0(严格加密)在进行任何 TDS 协议协商之前执行 TLS 握手。 这种方法可防止攻击者将整个连接降级。 TDS 8.0 需要 SQL Server 2022 或 Azure SQL:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=strict

在严格模式下, TrustServerCertificate 该参数被忽略。 证书验证总是默认使用系统信任存储。 你可以提供 certificateserverCertificate 定制验证。

最低 TLS 版本

使用 tlsmin 参数强制执行最低TLS版本:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2

有效值:1.0、、1.11.21.3

加密参数摘要

参数 违约 Description
encrypt false 加密模式。 Azure SQL 无论如何设置,服务器端始终需要加密。
TrustServerCertificate 取决于 encrypt true时跳过证书验证。 当指定 encrypt 时,默认值为 false;当省略 encrypt 时,默认值为 true
certificate - 用于链验证的PEM/DER文件路径。
serverCertificate - 用于字节级比较的PEM/DER文件路径。
hostnameincertificate - 覆盖证书中的预期主机名称。
tlsmin - 最低TLS版本。