驅動go-mssqldb程式支援多種加密模式及憑證驗證策略,以連接 SQL Server 與 Azure SQL。 本文說明每種加密模式、如何設定憑證驗證,以及何時使用 TDS 8.0 嚴格模式。
選擇 TLS 配置
在調整個別參數前,請使用此表格選擇最符合你環境的安全方案。
| 劇本 | 建議的設定 | 原因為何 |
|---|---|---|
| Azure SQL 或 SQL Server 2022 及更新版本,你想要最強的預設保護 | encrypt=strict |
TDS 8.0 會在 TDS 協商前執行 TLS 握手,並且總是驗證憑證。 |
| 伺服器憑證會連結到受信任的公共或企業憑證 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 為以下其中一個值:
| 價值 | 行為 |
|---|---|
strict |
TDS 8.0 加密。 TLS 握手發生在 TDS 連線談判之前。 需要 SQL Server 2022 或 Azure SQL。 |
true 或 mandatory |
在 TDS 預登入握手後,連線即會加密。 |
false 或 optional |
加密僅在伺服器需要時使用。 當未指定 encrypt 時,這是預設值。 Azure SQL 總是需要伺服器端加密,因此無論設定如何,連接 Azure SQL 都會被加密。 |
disable |
沒有加密。 不建議用於生產。 |
範例
透過以下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(嚴格加密)會先執行 TLS 握手,再進行任何 TDS 協定協商。 這種做法可防止攻擊者將整個連線降級。 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.1、 1.2、 1.3。
加密參數摘要
| 參數 | 預設 | Description |
|---|---|---|
encrypt |
false |
加密模式。 Azure SQL 無論如何設定,伺服器端始終需要加密。 |
TrustServerCertificate |
取決於 encrypt |
當 true時跳過憑證驗證。 當指定encrypt時,預設值為false;當省略encrypt時,預設值為true。 |
certificate |
- | 用於鏈驗證的 PEM/DER 檔案路徑。 |
serverCertificate |
- | 用於位元組層級比較的 PEM/DER 檔案路徑。 |
hostnameincertificate |
- | 覆寫憑證中預期的主機名稱。 |
tlsmin |
- | 最低 TLS 版本。 |