MSSQL 2022 如何創建 自簽署SSL憑證證書 導入並啟用加密連接
繼前幾篇
已經是可以用的狀態了,補上最後一偏安全的問題 SSL證書,這個一般是需要花錢購買的,由第三方CA機構簽名才能把自己的域名發布到公共信任清單上。本篇測試用的用自簽署證書來測試整個流程。
以下總共分成下列幾大項目
- 創建SSL證書
- 在伺服器上安裝私鑰
- 設置伺服器端證書權限
- 在SQLSERVER中啟用SSL證書
- 在客戶端上安裝公鑰
- 測試加密狀態
本篇是完全手動最麻煩的教學攻略,要快速建造SSL直接用PowerShell是最快的
詳細請參考這一篇:CHG: MSSQL 2022 快速建構 自簽署SSL證書
快速建構篇是以本篇已經完成後的狀態去做的,不過基本也包含本篇8程的內容了,唯一缺少的是【4. 在SQLSERVER中啟用SSL證書】,如果要偷吃步直接跳記得這個步驟要補上
0. 安裝環境 MSYS2 與 OpenSSL
安裝這個是因為上面有現成的 OpenSSL 可以用,這個要在Windows上官方沒有給編譯好的檔案,除了自行編譯外只能載第三方編譯的。
載點:https://www.msys2.org/#installation
打開之後直接下一步就行了,沒什麼選項
打開之後長這樣輸入該指令安裝 OpenSSL
pacman -S openssl
這樣就安裝好可以用了
1. 創建SSL證書
分以下幾個步驟創建
創建私鑰
openssl genpkey -algorithm RSA -out private_key.pem
這個執行完畢就創好了,私鑰要保存好不能公開
創建憑證請求
openssl req -new -key private_key.pem -out request.csr
這邊會需要輸入很多,唯一要注意的就是域名別亂填要填該伺服器主機的IP或域名
(這個會影響到之後接入的問題,如果IP是浮動會跑的趁現在趕緊固定一下)
簽署該請求 (本來應該是由第三方CA做的)
openssl x509 -req -days 365 -in request.csr -signkey private_key.pem -out certificate.cer
這樣就能拿到公鑰了 (這份私簽的證書不會上公服,要手動發給客戶端才能用)
這裡的私鑰其實應該是在產一個比較好,只是方便直接拿來用了
實際上提交給CA簽署的的時候,不用也不能連請求的私鑰也一起給出去
由CA簽署過的公鑰會被上傳到公共伺服器,實際上也不需要發送給客戶
只要證書還有效,客戶就能能從公共伺服器直接獲取並連上該域名
合成完整的證書
openssl pkcs12 -export -out certificate.pfx -inkey private_key.pem -in certificate.cer
這個可以把私鑰跟公鑰合併起來,合併後才是完整的證書
最小限度可以僅保存這個檔案就好,但公鑰cer建議保存,方便你發布到其他電腦
(不然丟了還要從 pfx 檔案打指令挖出來,或是安裝後按匯出公鑰)
確認檔案
最後 MSYS2 的預設使用者位置在這裡 (直接貼上就好)
C:\msys64\home\%UserName%
確認一下檔案都在這兩個框起來是需要的檔案
2. 在伺服器上安裝私鑰
安裝證書
對著pfx檔案點擊右鍵"安裝pfx"
進入安裝介面選擇"本機電腦"
選擇下一步,密碼跟設置成可匯出根據自己需求選擇
安裝到"個人"(否則在SqlServer中會看不到證書)
3. 設置伺服器端證書權限
再來需要設置權限給 SQLSserver 有權使用他
按下 CTRL+R 打開執行視窗輸入 "certlm.msc" 按下確定打開憑證管理員
然後在個人中找到剛剛安裝的證書右鍵管理私密金鑰
選擇新增
然後輸入 NT Service\MSSQLSERVER 後按下檢查名稱,之後按下確定
這裡 MSSQLSERVER 其實就是預設的實例名,如果忘了實例名
可以像圖中背景那樣從SQL設定管理員那裏抄過來就好
看一下有沒有多出 MSSQLSERVER 然後再按下確定
這樣就完成了SQL已經有權限可以使用他
4. 在SQLSERVER中啟用SSL證書
再來到 SQL 設定管理員中啟用該證書
對著通訊協定按右鍵內容 -> 選擇憑證分頁 -> 選擇你的憑證
前面一頁旗標的分頁打開強制加密
最後再把 SQLServer 重新啟動即可
至此就完成這樣伺服器端的設置了
5. 在客戶端上安裝公鑰
在客戶端上對著cer檔案按右鍵安裝憑證
選擇本機電腦
安裝到"受信任的根憑證授權單位"
這樣就完成了。 (注意這個不能裝到別的地方會無效)
6. 測試加密狀態
要測試的話可以參考這一篇
CHG: SQL Server 如何加密連接 Server/Client 端解說
這邊簡單把內容搬過來快速講一下,就是打入測試指令而已。
記得尾端要移除 -N -C 這樣才能測試伺服器端到底有沒有強制打開。
sqlcmd -S '192.168.3.54,1433' -U 'chg' -P 'chg' -Q 'SET NOCOUNT ON SELECT c.session_id, c.encrypt_option, s.login_name, c.client_net_address, s.program_name FROM sys.dm_exec_connections c JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id WHERE c.session_id = @@SPID' -W
這邊有一點要注意的是連入的伺服器名稱必須跟證書上的一樣,我上面創建證書是用IP就只能用IP登入,原本其實打電腦名稱也可以登入導入後就不行了。
這邊可以看到有個 True 這個就是成功加密了
可能有人有注意到圖中是伺服器端自己連自己,這樣測試還有效嗎?答案是有效的。因為就如同剛剛所提 cer 沒有導入到"受信任的根憑證授權單位"就無法使用,自然就無法依靠安裝在"個人"中的 pfx 證書連上了。
可能會想說那我直接把 pfx 安裝在"受信任的根憑證授權單位"不就可以一舉兩得?想法很完美但 SqlServer 預設只會讀"個人"中的證書,會直接導致看不到證書無法設置定的。