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 對於憑證的要求如下
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