[SQL Server] sqlcmd命令 如何加密連接 Server/Client 端解說
加密連接可以只單獨改一邊即可,當然伺服器端能直接強制加密是最好,就不用每一台客戶端都還要去更動。
測試是否正在加密中
在開始之前先說明這個指令可以用來測試是否加密中,請把它保存到 encrypt.sql 之中待會會用到。
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
保存好之後可以打開 SSMS 或 AzureDataStudio 測試一下這個 Querry 的結果。而這兩個軟體可以直接在圖形介面中選擇加密與信任伺服器就可以加密了。
下圖以 AzureDataStudio 為例子選中這兩個就能實現加密了
然後這是執行結果
其中的 SQLServerCEIP 這個東西是表示此連接與客戶體驗改進計劃 (CEIP) 有關,該計劃會定期從安裝的SQL Server中收集基本信息以幫助Microsoft改進其產品。
可以看到傳輸的信息已經是加密狀態了,這個可以一次看到全部所有的人加密狀態。如過要限縮範圍到當次連線的會話可以在 sql 中追加下面這段。
WHERE
c.session_id = @@SPID
伺服器端的設定
打開 SQL Server 設定管理員從這裡強制打開
打開之後再從這裡重新啟動一下服務才會生效
再來絕大多數客戶端就算沒有特別改什麼也會生效被強制加密的
客戶 sqlcmd 端設定
如果伺服器端無法強制啟用只能從客戶端下手,這邊需要在命令加上 -N -C 這樣可以由客戶端強制加密連線
sqlcmd -S '192.168.3.123,1433' -U 'sa' -P '12345678' -i '.\encrypt.sql' -W -N -C
執行結果
可以看到已經是加密狀態了
快速測試
sqlcmd -S '192.168.3.123,1433' -U 'sa' -P '12345678' -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 -N -C
對於該命令
- 測試伺服啟有沒有啟用加密,要消除結尾的 -N -C 解除強制加密
- 顯示包含其他連線,要消除 WHERE c.session_id = @@SPID
加密的選項
- -N:由客戶端強制加密
- -C:無條件信任證書
信任證書主要是用在如果證書不是買來的而是自己生成的,那麼預設情況下會被檔下來,以避免你連到別人假冒的服務器上
作為企業內部的網站並不公開可能不是那麼有必要買證書,不想花錢的話可以把自簽署證書加入信任清單,這樣即使不使用 -C 也可以正常連接