Microsoft.Data.SqlClient 中的加密和憑證驗證
SQL Server 一律會加密與登入有關的網路封包。 如果伺服器未提供憑證佈建,則在啟動時,SQL Server 會產生自我簽署憑證,其中還用它來對登入封包進行加密。
進一步來説,用戶端與伺服器之間的加密可確保用戶端和伺服器只能讀取資料。 伺服器憑證驗證是加密流程的重要部分。 伺服器憑證驗證可讓用戶端確保伺服器的身分符合其表示的身分。 憑證會針對到期、信任鏈結等項目執行驗證,並驗證憑證中的名稱是否符合用戶端連線的伺服器名稱。 如需詳細資訊,請參閱傳輸層安全性和數位憑證。
強烈建議您在 SQL Server 上佈建可驗證的憑證,以提供安全連線能力。 傳輸層安全性 (TLS) 只能透過憑證驗證來保護。
應用程式可能要求加密所有網路流量,其方式是使用 Encrypt
連接字串關鍵字或連接屬性。 根據預設,加密連線的所有網路流量會要求在伺服器上提供憑證。 藉由將您的用戶端設定為信任伺服器上的憑證,您可能很容易受到中間人攻擊。 如果在伺服器上部署可驗證的憑證,請確定用戶端 Encrypt
設定為 True
,且 Trust Server Certificate
設定為 False
。
如要在未於伺服器上佈建憑證的情況下啟用加密以便使用,可以使用 Encrypt
和 Trust Server Certificate
用戶端設定。 在此情況,加密會使用自我簽署的伺服器憑證,而不需用戶端進行驗證。 此組態會將連線加密,但不會防止用戶端與伺服器之間的裝置攔截連線並對加密進行 Proxy 處理。
加密和憑證驗證行為中的變更
Microsoft.Data.SqlClient 4.0 版引進加密設定的中斷性變更。 Encrypt
現預設為 True
。
Microsoft.Data.SqlClient 2.0 版在 Trust Server Certificate
設定的行為中引進中斷性變更。 之前如果 Encrypt
設定為 False
,則不論 Trust Server Certificate
設定為何,都不會驗證伺服器憑證。 現在如果伺服器強制加密,則會根據 Trust Server Certificate
設定來驗證伺服器憑證,即使 Encrypt
設定為 False
也是如此。
4.0 版
下表描述加密和憑證設定的加密和驗證成果:
Encrypt 用戶端設定 |
Trust Server Certificate 用戶端設定 |
Force encryption 伺服器設定 |
結果 |
---|---|---|---|
False | False (預設值) | No | 加密只會對 LOGIN 封包進行。 憑證未進行驗證。 |
False | False (預設值) | Yes | (行為變更,從 1.0 版變更為 2.0 版) 只有當有可驗證的伺服器憑證時,才會發生所有網路流量的加密,否則連線嘗試會失敗。 |
False | True | Yes | 所有網路流量都會進行加密,且憑證未進行驗證。 |
True (新預設) | False (預設值) | N/A | 只有當有可驗證的伺服器憑證時才會發生所有網路流量的加密,否則連線嘗試會失敗。 |
True (新預設) | True | N/A | 所有網路流量都會進行加密,但憑證未進行驗證。 |
Strict (在 5.0 版中新增) | N/A | N/A | 只有當有可驗證的伺服器憑證時,才會使用 TDS 8 對所有網路流量加密,否則連線嘗試會失敗。 |
警告
上表僅提供有關在不同設定下系統行為的指南。 如需安全連線,請確保用戶端和伺服器都需要加密。 此外,也要確定伺服器具有可驗證的憑證,且用戶端上的 TrustServerCertificate
設定會設定為 False
。
從 Microsoft.Data.SqlClient 5.0 版開始,HostNameInCertificate
是新的連線選項。 伺服器憑證驗證可確保憑證中的一般名稱 (CN) 或主體別名 (SAN) 符合所連線的伺服器名稱。 在某些情況下 (例如 DNS 別名),伺服器名稱可能不符合 CN 或 SAN。 您可以使用 HostNameInCertificate
值,在伺服器憑證中指定不同的預期 CN 或 SAN。
2.0 版
從 2.0 版開始,伺服器強制執行加密時,不論 Encrypt
設定為何,用戶端都會根據 Trust Server Certificate
設定來驗證伺服器憑證。
下表描述加密和憑證設定的加密和驗證成果:
Encrypt 用戶端設定 |
Trust Server Certificate 用戶端設定 |
Force encryption 伺服器設定 |
結果 |
---|---|---|---|
False (預設值) | False (預設值) | No | 加密只會對 LOGIN 封包進行。 憑證未進行驗證。 |
False (預設值) | False (預設值) | Yes | (行為變更) 只有當有可驗證的伺服器憑證時,才會發生所有網路流量的加密,否則連線嘗試會失敗。 |
False (預設值) | True | Yes | 所有網路流量都會進行加密,且憑證未進行驗證。 |
True | False (預設值) | N/A | 只有當有可驗證的伺服器憑證時才會發生所有網路流量的加密,否則連線嘗試會失敗。 |
True | True | N/A | 所有網路流量都會進行加密,但憑證未進行驗證。 |
警告
上表僅提供有關在不同設定下系統行為的指南。 如需安全連線,請確保用戶端和伺服器都需要加密。 此外,也要確定伺服器具有可驗證的憑證,且用戶端上的 TrustServerCertificate
設定會設定為 False
。
1.0 版
下表描述加密和憑證設定的加密和驗證成果:
Encrypt 用戶端設定 |
Trust Server Certificate 用戶端設定 |
Force encryption 伺服器設定 |
結果 |
---|---|---|---|
False (預設值) | False (預設值) | No | 加密只會對 LOGIN 封包進行。 憑證未進行驗證。 |
False (預設值) | False (預設值) | Yes | 所有網路流量都會進行加密,但憑證未進行驗證。 |
False (預設值) | True | Yes | 所有網路流量都會進行加密,且憑證未進行驗證。 |
True | False (預設值) | N/A | 只有當有可驗證的伺服器憑證時才會發生所有網路流量的加密,否則連線嘗試會失敗。 |
True | True | N/A | 所有網路流量都會進行加密,但憑證未進行驗證。 |