Enabling Certificate for SSL on a SQL Server(利用憑證啟動SQL SSL加密連線)

Enabling Certificate for SSL on a SQL Server(利用憑證啟動SQL SSL加密連線)

 

緣由 : 近期由於幾台SQL Server要納入稽核伺服器監控,而SQL在每次啟動時都會動態產生一組憑證來加密封包,因此稽核伺服器在sniffing到封包後會無法解析。故我們要建立一組固定憑證,並設定SQL每次重啟時固定使用這一組憑證,這樣一來稽核伺服器就可以使用相同憑證來解開封包。

 

 

首先我們要使用makecert.exe這一個憑證產生工具來建立我們需要的憑證。而該工具當安裝過.Net Framework4.5後就會有了。該工具相關連結如下http://msdn.microsoft.com/zh-tw/library/bfsktky3(v=vs.110).aspx

而下圖就是產生憑證的指令語法

clip_image002

 

 

 

 

當我們完成上圖指令後,我們就可以在MMC的主控台憑證區看到我們剛剛建立的SQL1憑證。注意:該憑證位置是在 憑證-目前使用者 \ 個人 \ 憑證 中。

clip_image004

 

 

 

 

 

 

如下圖所示,我們要將該憑證先匯出來。

clip_image006

 

 

 

注意 : 匯出憑證時記得一併要將私密金鑰匯出,不然會有問題,後續會告訴大家。

clip_image008

 

 

 

clip_image010

 

 

clip_image012clip_image014

 

 

 

clip_image016

 

經過上述步驟後,我們就完成憑證匯出動作。

 

 

 

接下來我們將該憑證匯入到目錄為 憑證(本機電腦)  \ 個人 \ 憑證

clip_image018

 

clip_image020clip_image022

 

 

 

clip_image024

 

 

 

完成上面步驟後,我們就完成憑證匯入嘍。下圖所示,憑證已經匯進去了。

clip_image026

 

 

 

 

同樣的憑證也要匯進憑證(本機電腦)  \ 受信任的根憑證授權單位 \ 憑證

clip_image028

 

 

 

這一個步驟很重要,當我們在用makecert.exe工具產出憑證時,該憑證有一私密金鑰,預設該金鑰只給SystemAdministrators存取。因此當您的SQL啟動帳號不具這樣的權限去使用私密金鑰時,您的SQL會有無法啟動情況產生。在事件檢視器中可以看見該ERROR指出啟用SSL載入憑證錯誤的訊息。

 

所以此一步驟就是要將私鑰的使用權限開放給SQL的帳號使用。如下圖我們點選 憑證(本機電腦)  \ 個人 \ 憑證 的目錄,點選該憑證並選用 管理私密金鑰 功能。

clip_image030

 

下圖為該私鑰的預設權限。

clip_image032

如下圖所示,我們將SQLUSER群組加入並給予權限。

clip_image034

 

 

當我們將憑證準備好後,請開啟SQL組態管理工具並在SQL Server網路組態中點選MSSQLSERVER通訊協定後按下右鍵,選擇內容。

clip_image036

 

 

如下圖所示,我們點選憑證頁籤後在憑證的下拉選單中就可以選到我們已經建立好的憑證。

clip_image038

 

 

儲存變更後,要重啟SQL服務,SQL才會用該憑證啟動歐。

clip_image039

 

 

 

要如何知道SQL有沒有使用憑證呢 ? 請開啟SQL Server記錄檔,如果有使用憑證的話,您可以看見如下圖紅色圈選處的訊息。

clip_image041

 

 

 

 

剛剛我們在匯出憑證時,筆者有提到匯出時記得要一併匯出私鑰,不然SQL也無法使用該憑證啟動服務,以下為SQL對於憑證的需求

若要讓 SQL Server 載入 SSL 憑證,憑證必須符合下列條件:

·         憑證必須位於本機電腦憑證存放區或目前使用者憑證存放區。

·         目前的系統時間必須介於憑證的 Valid from 屬性和憑證的 Valid to 屬性之間。

·         憑證必須是為了伺服器驗證而準備的。因此,憑證的 Enhanced Key Usage 屬性必須指定 Server Authentication (1.3.6.1.5.5.7.3.1)

·         憑證必須使用 AT_KEYEXCHANGE  KeySpec 選項來建立。憑證的金鑰用法屬性 (KEY_USAGE) 通常也包括金鑰編密法 (CERT_KEY_ENCIPHERMENT_KEY_USAGE)

·         憑證的 Subject 屬性必須指出一般名稱 (CN) 與伺服器電腦的主機名稱或完整網域名稱 (FQDN) 是相同的。如果 SQL Server 是在容錯移轉叢集上執行,則一般名稱必須符合虛擬伺服器的主機名稱或 FQDN,且容錯移轉叢集中的所有節點都必須提供憑證。

·         SQL Server 2008 R2 SQL Server 2008 R2 Native Client 支援萬用字元憑證。其他用戶端可能不支援萬用字元憑證。如需詳細資訊,請參閱用戶端文件集和 KB258858 (機器翻譯)

 

資料來源: http://technet.microsoft.com/zh-tw/ms189067.aspx

 

 

 

 

 

 

 

 

這裡我做一個小實驗,故意匯入一個不含私鑰的憑證

 

clip_image043

 

 

然後我們再到SQL的組態管理員中去看看,我們可以發現下拉選單中依然只能看見一個憑證,該無私鑰的憑證由於不符SQL的需求因此不會顯示出來。

clip_image045

 

 

如果要在Cluster環境下設定的話,請先使用對外服務的FQDN來建立憑證,將憑證匯入到Node後,到SQL組態管理員中我們依然看不見該憑證(原因是因為該憑證的CN我們是用對外服務的ClusterFQDN產出的,所以CN不是Node的電腦名稱,所以無法用UI選到該憑證)。下圖為筆者故意建立一個CNSQL1.local的憑證。

clip_image047

 

 

如下圖所示,我們在UI中依然看不見SQL1.local這一個憑證。

clip_image049

 

對於這一種情形我們就得透過regedit的方式來修改,我們先將UI中看不見的憑證透過下圖的步驟取出我們需要的 憑證指紋 ,並將憑證指紋貼到regedit中。複製文字時請注意憑證指紋開頭會有一個看不見的unicode,因此複製文字請直接從第一個文字直接開始複製,略過前面的空白。

clip_image051

 

 

regedit的路徑為HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.x\MSSQLServer\SuperSocketNetLib\Certificate。將上一步驟複製的文字內容去掉空白後貼入(如下圖)

clip_image053

 

完成修改regedit後,我們重啟SQL,接下來可以在SQL Server記錄檔中看見SQL已經改用我們剛剛在regedit中填入的憑證開啟服務了。

clip_image055

 

以上為筆者近日的小小心得,希望對您能有所幫助。

 

 

 

Rock Chang

2014/02/24

 

我是ROCK

rockchang@mails.fju.edu.tw