GO-MSSQLDB 加密與憑證

驅動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。
truemandatory 在 TDS 預登入握手後,連線即會加密。
falseoptional 加密僅在伺服器需要時使用。 當未指定 encrypt 時,這是預設值。 Azure SQL 總是需要伺服器端加密,因此無論設定如何,連接 Azure SQL 都會被加密。
disable 沒有加密。 不建議用於生產。

範例

透過以下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(嚴格加密)會先執行 TLS 握手,再進行任何 TDS 協定協商。 這種做法可防止攻擊者將整個連線降級。 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.01.11.21.3

加密參數摘要

參數 預設 Description
encrypt false 加密模式。 Azure SQL 無論如何設定,伺服器端始終需要加密。
TrustServerCertificate 取決於 encrypt true時跳過憑證驗證。 當指定encrypt時,預設值為false;當省略encrypt時,預設值為true
certificate - 用於鏈驗證的 PEM/DER 檔案路徑。
serverCertificate - 用於位元組層級比較的 PEM/DER 檔案路徑。
hostnameincertificate - 覆寫憑證中預期的主機名稱。
tlsmin - 最低 TLS 版本。