啟用 SQL Server SSL 連線加密

SQL Server 與 AP 之間傳輸使用TDS(Tabular Data Stream)封包,為了怕封包被攔截,可以使用 SSL 保護

研究兩天的資料庫連線加密,在此做個小小的紀錄...

本文連結

開發環境

  • SQL Server 2014 Developer Edition
  • Windows Server 2008 R2 Datacenter
  • SSMS v17.9.1
  • LINQPad 5

 

憑證需求

啟用 SSL 的關鍵就是憑證,SQL Server 對於憑證的要求如下

下圖出自 https://docs.microsoft.com/zh-tw/sql/database-engine/configure-windows/enable-encrypted-connections-to-the-database-engine?view=sql-server-2017#certificate-requirements


CA 憑證

請求 CA 憑證步驟如下

 

自簽憑證

用管理員權限執行以下腳本 CN 必須要要是 FQDN,電腦名稱+Domain

makecert -r -pe -n "CN=lab.test.local" -e "01/01/2030" -eku 1.3.6.1.5.5.7.3.1 -sky exchange -a sha256 -len 2048 -ss my -sr localMachine

 

SQL Instance 使用憑證

開啟 SQL Server 組態管理員

設定步驟如下

 

是否強制加密

是:不論 Client 端有沒有選擇加密都會使用加密連線

否:可以由 Client 端決定要不要使用連線加密,後面會在解釋


選擇憑證,做完設定後要會跳出重啟 SQL Instance 的對話視窗

賦予虛擬帳號存取憑證權限

NT SERVICE\MSSQL$SQL2014 帳號是啟動 SQL Instance 的虛擬帳號

重啟 SQL Instance

 

Client 連遠端 SQL Server

如果是在同一個 Domain 不需要用 FQDN,只要電腦名稱,反之就要;當然也不可以用 IP 唷

 

由 Client 端決定是否要加密

前面有提到,假如 SQL Sserver 強制加密設定成否,即可以由 Client 端根據使用情境決定是否要加密,SSMS 設定如下

1.勾選 Encrypt Connection

ADO.NET 的連線字串加上 Encrypt=True; 

2.匯入SQL Instance 使用的那一張憑證

  • 跟 CA 請求憑證或是自簽憑證都要匯入到 Trusted Root Certification Authorities(受信任的根憑證授權單位)
  • 若是跟 CA 請求的憑證,只需要匯入 CA 根憑證,這對於 Domain 來講太方便,預設 CA 根憑證已經安裝在用戶端了。

 

連接失敗,Client 沒有受信任的憑證

由 Client 端決定是否信任遠端伺服器的憑證

Trust server certificate 也勾選的話,Client 就不需要匯入憑證了,這好棒棒的說,SSMS設定如下

ADO.NET 的連線字串加上 TrustServerCertificate=True; 

 

驗證是否有加密

這裡使用 Microsoft Message Analyzer 監聽 SQL Server 網路封包,操作步驟請參考上一篇

https://dotblogs.com.tw/yc421206/2019/05/23/microsoft_messagea_nalyzer_sql_server_package

 

過濾 *SQLBatch or TDS 已經找不到相關的 SQL 命令了

 

參考資料

https://docs.microsoft.com/zh-tw/sql/database-engine/configure-windows/enable-encrypted-connections-to-the-database-engine?view=sql-server-2017
 

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo