SQL Server SSL 加密 - SelfSign Cert 工作 - 為什麼?
我意識到這是一種奇怪的行為,我想知道在使用 SQL Server 生成的自簽名證書時它是否應該以這種方式工作。
- 設置了“加密連接”選項的客戶端(Management Studio),客戶端將在 SQL Server 端驗證自簽名證書並失敗,因為自簽名證書不受信任
- 客戶端(Management Studio)沒有設置“加密連接”選項,但使用 SQL Server 配置管理器在 SQL Server 端打開了**“強制加密” 。**客戶端將不會驗證自簽名證書,並將成功連接並加密連接。
問題
- 為什麼在伺服器端強制執行加密時,客戶端不嘗試驗證 SQL Server 自簽名證書?為什麼在客戶端強制執行加密時,客戶端只驗證自簽名證書?
- 如果伺服器端加密沒有在客戶端進行證書身份驗證,那麼使用 CA 簽名證書有什麼意義?
更準確地說:當僅打開伺服器端加密時,為什麼客戶端(Mgmt Studio)不嘗試驗證/驗證證書(是自簽名/CA 簽名) ?為什麼客戶端僅在打開客戶端加密(“加密連接”)時驗證/驗證伺服器提供的證書?
我添加了一個簽名證書(由內部 CA 簽名)用於伺服器端加密。這需要在客戶端機器上安裝內部 CA 證書(到受信任的根 CA),但我沒有這樣做。但是,打開伺服器端加密後,客戶端(mgmt studio)仍然可以成功連接。
當您打開伺服器端的強制加密選項時,無論客戶端加密規範如何,流量都會被加密(SSCM–>SQL Server 網路配置–>MSSQLSERVER 的協議–>屬性–>標誌–>強制加密)。如果您不安裝來自受信任 CA 的證書,SQL Server 將使用自簽名證書。
客戶端無法驗證自簽名證書,因為不存在受信任的第三方。因此,需要加密
Encrypt=true
(TrustServerCertificate=true
基本上是在說“是的,我了解風險,但無論如何都要連接”,並且證書鏈未經驗證。CA 頒發的證書將受信任的第三方添加到組合中,因此客戶端可以使用
TrustServerCertificate=false
. 儘管您可以連接TrustServerCertificate=true
並獲得 CA 頒發的證書(我認為這是您的第二個問題),但這不太安全,因為客戶可能會在不知情的情況下使用自簽名證書。當僅打開伺服器端加密時,為什麼客戶端(Mgmt Studio)不嘗試驗證/驗證證書(是自簽名/CA 簽名)?
為什麼客戶端僅在 > 客戶端加密(“加密連接”)打開時驗證/驗證伺服器提供的證書?
伺服器可以為所有客戶端強制加密流量,但驗證證書的責任始終在客戶端。考慮預設連接設置
Encrypt=false
在 SSMS 和其他客戶端中。這就是說“我不需要加密流量,因此無論伺服器設置或證書如何都可以連接。”ForceEncryption=true
無論客戶端請求的加密級別如何,伺服器設置都通過加密流量來加強此預設設置。此行為與ADO.NET 提供程序的連接字元串語法文件的摘錄一致:應用程序設置不會降低 SQL Server 客戶端配置管理器設置的安全級別,但可能會加強它。
由於客戶端一開始並沒有請求加密,因此不會執行證書驗證,但仍然可以通過使用 SQL Server 上提供的任何證書對流量進行加密來增強安全性。客戶可以指定
Encrypt=true
並TrustServerCertificate=false
進一步加強安全性。這不僅可以驗證可信證書是否存在,而且即使ForceEncryption=false
在伺服器上也可以加密流量。客戶必須選擇加入證書驗證。這樣做是為了使您能夠從伺服器強制加密,而無需獲取受信任的證書、在客戶端上安裝證書或更改客戶端連接字元串。請參閱產品文件中的使用未經驗證的加密。