設定 SQL Server 資料庫引擎來加密連線
只適用於 SQL Server - 僅限 Windows。
您可以將所有連入 SQL Server 的連線加密,或只針對特定的一組用戶端啟用加密功能。 在這些案例中,您必須先設定 SQL Server,以使用符合 SQL Server 憑證需求的憑證,再對伺服器電腦或用戶端電腦採取額外步驟來加密數據。
注意
本文適用於 Windows 上的 SQL Server。 若要為加密連線設定 Linux 上的 SQL Server,請參閱指定 TLS 設定。
本文說明如何針對憑證來設定 SQL Server (步驟 1),以及如何變更 SQL Server 執行個體的加密設定 (步驟 2)。 使用公用商業授權單位的憑證時,必須執行這兩個步驟才能加密所有連入 SQL Server 的連線。 若為其他案例,則請參閱特殊的 SQL Server 連線加密案例。
步驟 1:設定 SQL Server 以使用憑證
若要設定 SQL Server 以使用憑證 (如 SQL Server 的憑證需求所述),請遵循下列步驟:
- 在執行 SQL Server 的電腦上安裝憑證。
- 設定 SQL Server 以使用所安裝的憑證。
視您在 SQL Server 電腦上可以存取的 SQL Server 組態管理員版本而定,請使用下列其中一個程序來安裝和設定 SQL Server 執行個體。
具有 SQL Server 2019 和更新版本 SQL Server 組態管理員的電腦
在 SQL Server 2019 (15.x) 和更新版本,憑證管理功能會整合到 SQL Server 組態管理員內,而且可與舊版的 SQL Server 搭配使用。 若要在單一 SQL Server 執行個體、在容錯移轉叢集設定或可用性群組設定中新增憑證,請參閱憑證管理 (SQL Server 組態管理員)。 組態管理員可藉由負責安裝憑證,並用幾個步驟就設定好 SQL Server 以使用所安裝的憑證,而大幅簡化憑證管理工作。
電腦上之使用者的憑證會儲存在本機中。 若要安裝憑證以供 SQL Server 使用,您必須使用具有本機系統管理員權限的帳戶來執行 SQL Server 組態管理員。
您可以暫時安裝 SQL Server 2019 (15.x) 的 Express Edition 或更新版本,以使用 SQL Server 組態管理員來支援整合式憑證管理功能。
具有 SQL Server 2017 和更早版本 SQL Server 組態管理員的電腦
如果您使用的是 SQL Server 2017 (14.x) 或更舊的版本,且無法使用適用於 SQL Server 2019 (15.x) 的 SQL Server 組態管理員,請遵循下列步驟以在 SQL Server 電腦上安裝和設定憑證:
- 在 [開始] 功能表上選取 [執行],並在 [開啟] 方塊中鍵入 MMC,然後選取 [確定]。
- 在 MMC 主控台的 [檔案] 功能表上,選取 [新增/移除嵌入式管理單元...]。
- 在 [新增或移除嵌入式管理單元] 對話方塊中,選取 [憑證],然後選取 [新增]。
- 在 [憑證嵌入式管理單元] 對話方塊中,選取 [電腦帳戶],然後選取 [下一步]>[完成]。
- 在 [新增或移除嵌入式管理單元] 對話方塊中,選取 [確定]。
- 在 MMC 主控台中,展開 [憑證 (本機電腦)]>[個人],以滑鼠右鍵按一下 [憑證],指向 [所有工作],然後選取 [匯入]。
- 完成憑證匯入精靈以將憑證新增至電腦。
- 在 MMC 主控台中,以滑鼠右鍵按一下匯入的憑證,指向 [所有工作],然後選取 [管理私密金鑰]。 在 [安全性] 對話方塊中,新增 SQL Server 服務帳戶所使用之使用者帳戶的讀取權限。
- 在 [SQL Server 組態管理員] 中展開 [SQL Server 網路組態],以滑鼠右鍵按一下 [<伺服器執行個體> 的通訊協定],然後選取 [屬性]。
- 在 [執行個體名稱屬性的通訊協定] 對話方塊的 [憑證] 索引標籤上,從 [憑證] 方塊的下拉式清單中選取所需的憑證,然後選取 [確定]。<>
- 如果您需要加密 SQL Server 的所有連線,請參閱步驟 2:在 SQL Server 中設定加密設定。 如果您只想要啟用特定用戶端的加密功能,請重新啟動 SQL Server 服務,並查看特殊的 SQL Server 連線加密案例。
注意
若要在可用性群組組態中安裝憑證,請從主要節點開始,在可用性群組的每個節點上重複上述程式。
重要
SQL Server 服務帳戶必須擁有用來在 SQL Server 執行個體上強制加密的憑證讀取權限。 針對不具有特殊權限的服務帳戶,則必須將讀取權限新增至憑證中。 若不進行此操作,可能會導致 SQL Server 服務重新啟動失敗。
容錯移轉叢集執行個體的額外程序
SQL Server 用來加密連線的憑證會在下列登錄機碼中指定:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.x\MSSQLServer\SuperSocketNetLib\Certificate
此機碼包含稱為指紋的憑證屬性,可用來識別伺服器中的每個憑證。 在叢集化環境中,即使存放區中有正確的憑證,此機碼仍會設定為 Null
。 若要解決此問題,您必須在將憑證安裝至每個節點之後,於每個叢集節點上執行這些額外步驟:
瀏覽至完整網域名稱 (FQDN) 憑證存放所在的憑證存放區。 在憑證的屬性頁面上,移至 [詳細資料] 索引標籤,並將憑證的指紋值複製到 [記事本] 視窗。
移除 [記事本] 中指紋值內十六進位字元之間的空格。
啟動登錄編輯程式,瀏覽至下列登錄機碼,然後貼上步驟 2 中的值:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib\Certificate
如果 SQL 虛擬伺服器目前在此節點上,請容錯移轉至叢集中的另一個節點,然後將發生登錄變更的節點重新開機。
在所有節點上重複此程序。
警告
不當編輯登錄可能會造成系統嚴重受損。 在變更登錄之前,建議您先備份電腦上的所有重要資料。
注意
SQL Server 2008 R2 (10.50.x) 和 SQL Server 2008 R2 (10.50.x) Native Client (SNAC) 支援萬用字元憑證。 SNAC 已淘汰,並已替換成 Microsoft OLE DB Driver for SQL Server 和 Microsoft ODBC Driver for SQL Server。 其他用戶端可能不支援萬用字元憑證。
您無法使用 SQL Server 組態管理員來選取萬用字元憑證。 若要使用萬用字元憑證,您必須編輯 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQLServer\SuperSocketNetLib
登錄機碼,在 [憑證] 值輸入不含空格的憑證指紋。
注意
若要在容錯移轉叢集中使用加密功能,請務必在容錯移轉叢集中的所有節點上,對於虛擬伺服器使用完整的 DNS 名稱來安裝伺服器憑證。 您可以在 [SQL Server 網路組態] 的 [virtsql 通訊協定] 屬性方塊中,將 ForceEncryption 選項的值設為 [是]。
在 Azure 虛擬機上建立 Azure 搜尋服務索引器與 SQL Server 的加密連線時,請參閱 Azure 虛擬機上 SQL Server 實例的索引器連線。
步驟 2:在 SQL Server 中設定加密設定
只有在想要讓所有用戶端強制進行加密通訊時,才需要執行下列步驟:
- 在 SQL Server 組態管理員中展開 [SQL Server 網路組態],以滑鼠右鍵按一下 [<伺服器執行個體> 的通訊協定],然後選取 [屬性]。
- 在 [旗標] 索引標籤的 [ForceEncryption] 方塊中選取 [是],然後選取 [確定] 以關閉對話方塊。
- 重新啟動 SQL Server 服務。
注意
某些憑證案例可能會要求您在用戶端電腦和用戶端應用程式中實作其他步驟,以確保用戶端與伺服器之間會以加密方式連線。 如需詳細資訊,請參閱特殊的 SQL Server 連線加密案例。
詳細資訊
登入封包加密與資料封包加密
概括而言,SQL Server 用戶端應用程式與 SQL Server 之間的網路流量有兩種封包:認證封包 (登入封包) 和資料封包。 當您設定加密功能 (不論是伺服器端還是用戶端) 時,系統一律會加密這兩種封包。 但即使您未設定加密功能,系統還是會一律為用戶端應用程式在連線到 SQL Server 時所傳輸的 (登入封包中的) 認證加密。 SQL Server 會使用符合受信任憑證授權單位憑證需求的憑證 (如果有的話)。 此憑證可由系統管理員手動設定 (使用本文前面討論的其中一個程序),也可以存在於 SQL Server 電腦上的憑證存放區中。
SQL Server 產生的自我簽署憑證
如果有可用於加密登入封包的受信任憑證授權單位憑證,SQL Server 便會使用該憑證。 如果未安裝受信任的憑證,則 SQL Server 會在啟動期間產生自我簽署憑證 (後援憑證),並使用該自我簽署憑證來加密認證。 這個自我簽署憑證有助於提升安全性,但無法防止伺服器的身分識別詐騙。 如果使用自我簽署憑證,且 [ForceEncryption] 選項的值設為 [是],則 SQL Server 和用戶端應用程式之間透過網路傳輸的所有資料都會使用自我簽署憑證來加密。
使用自我簽署憑證時,SQL Server 會將下列訊息記錄到錯誤記錄中:
已成功載入自我產生的憑證以進行加密。
SQL Server 2016 (13.x) 和較舊版本使用 SHA1 演算法。 不過,從 SQL Server 2016 (13.x) 開始,便已取代 SHA1 演算法和許多較舊的演算法。 如需詳細資訊,請參閱 SQL Server 2016 (13.x) 中已被取代 資料庫引擎 功能。
在這些環境中,如果您使用 SQL Server 自動產生的自我簽署憑證,不論其產生憑證的目的只是要進行登入前交握還是要加密所有伺服器與用戶端之間的通訊,您的弱點偵測軟體或安全性軟體或公司原則都可能會將此用途標示為安全性問題。 針對這些案例,您可以選擇進行以下操作:
- 建立新的自我簽署憑證或第三方憑證 (且該憑證使用更強大的加密演算法),並設定 SQL Server 以使用這個新憑證。
- 由於您現在已了解加上旗標的原因,因此可以忽略訊息 (不建議這麼做)。
- 升級至 SQL Server 2017 (14.x) 或更新版本,以便為自我簽署憑證使用更強大的雜湊演算法 (SHA256)。
用來為 SQL Server 建立自我簽署憑證的 PowerShell 指令碼
下列程式碼片段可用來在執行 SQL Server 的電腦上建立自我簽署憑證。 該憑證符合獨立 SQL Server 執行個體的加密需求,並儲存在本機電腦的憑證存放區中 (PowerShell 必須以系統管理員身分啟動):
# Define parameters
$certificateParams = @{
Type = "SSLServerAuthentication"
Subject = "CN=$env:COMPUTERNAME"
DnsName = @("{0}" -f [System.Net.Dns]::GetHostByName($env:computerName).HostName, 'localhost')
KeyAlgorithm = "RSA"
KeyLength = 2048
HashAlgorithm = "SHA256"
TextExtension = "2.5.29.37={text}1.3.6.1.5.5.7.3.1"
NotAfter = (Get-Date).AddMonths(36)
KeySpec = "KeyExchange"
Provider = "Microsoft RSA SChannel Cryptographic Provider"
CertStoreLocation = "cert:\LocalMachine\My"
}
# Call the cmdlet
New-SelfSignedCertificate @certificateParams
確認網路加密
若要確認您已設定好網路加密並有成功啟用,請執行下列 Transact-SQL 查詢:
USE [master];
GO
SELECT DISTINCT (encrypt_option)
FROM sys.dm_exec_connections
WHERE net_transport <> 'Shared memory';
GO
encrypt_option
直欄是布林值,表示是否為此連線啟用加密。 如果值為 TRUE
,則連線會安全地加密。 如果值為 FALSE
,則連線不會進行加密。
具有權限的 SQL Server 憑證行為
如果下列所有條件均成立,SQL Server 服務會自動偵測並使用憑證進行加密:
- 憑證具有主體,其中包含機器的 FQDN
- 將憑證安裝至本機電腦憑證存放區
- SQL Server 服務帳戶已獲授予存取憑證的私密金鑰之權利
即使未在 SQL Server 組態管理員中選取憑證,也會發生此使用情況。
若要覆寫此行為,請:
設定要用於 SQL Server 組態管理員的另一個憑證
或
移除 SQL Server 服務帳戶對不需要的憑證的權限