该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。 |
true 或 mandatory |
TDS预登录握手后,连接会被加密。 |
false 或 optional |
加密仅在服务器需要时使用。 当未指定 encrypt 时,这是默认值。 Azure SQL 总是需要服务器端加密,因此无论设置如何,连接 Azure SQL 都会被加密。 |
disable |
无加密。 不建议用于生产。 |
Example
通过使用encrypt参数在 连接字符串 中启用加密:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true
证书验证
当你启用加密(encrypt=true 或 encrypt=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 该参数被忽略。 证书验证总是默认使用系统信任存储。 你可以提供 certificate 或 serverCertificate 定制验证。
最低 TLS 版本
使用 tlsmin 参数强制执行最低TLS版本:
sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2
有效值:1.0、、1.11.2、 1.3。
加密参数摘要
| 参数 | 违约 | Description |
|---|---|---|
encrypt |
false |
加密模式。 Azure SQL 无论如何设置,服务器端始终需要加密。 |
TrustServerCertificate |
取决于 encrypt |
当 true时跳过证书验证。 当指定 encrypt 时,默认值为 false;当省略 encrypt 时,默认值为 true。 |
certificate |
- | 用于链验证的PEM/DER文件路径。 |
serverCertificate |
- | 用于字节级比较的PEM/DER文件路径。 |
hostnameincertificate |
- | 覆盖证书中的预期主机名称。 |
tlsmin |
- | 最低TLS版本。 |