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
而下圖就是產生憑證的指令語法
當我們完成上圖指令後,我們就可以在MMC的主控台憑證區看到我們剛剛建立的SQL1憑證。注意:該憑證位置是在 憑證-目前使用者 \ 個人 \ 憑證 中。
如下圖所示,我們要將該憑證先匯出來。
注意 : 匯出憑證時記得一併要將私密金鑰匯出,不然會有問題,後續會告訴大家。
經過上述步驟後,我們就完成憑證匯出動作。
接下來我們將該憑證匯入到目錄為 憑證(本機電腦) \ 個人 \ 憑證
完成上面步驟後,我們就完成憑證匯入嘍。下圖所示,憑證已經匯進去了。
同樣的憑證也要匯進憑證(本機電腦) \ 受信任的根憑證授權單位 \ 憑證
這一個步驟很重要,當我們在用makecert.exe工具產出憑證時,該憑證有一私密金鑰,預設該金鑰只給System及Administrators存取。因此當您的SQL啟動帳號不具這樣的權限去使用私密金鑰時,您的SQL會有無法啟動情況產生。在事件檢視器中可以看見該ERROR指出啟用SSL載入憑證錯誤的訊息。
所以此一步驟就是要將私鑰的使用權限開放給SQL的帳號使用。如下圖我們點選 憑證(本機電腦) \ 個人 \ 憑證 的目錄,點選該憑證並選用 管理私密金鑰 功能。
下圖為該私鑰的預設權限。
如下圖所示,我們將SQL的USER群組加入並給予權限。
當我們將憑證準備好後,請開啟SQL組態管理工具並在SQL Server網路組態中點選MSSQLSERVER通訊協定後按下右鍵,選擇內容。
如下圖所示,我們點選憑證頁籤後在憑證的下拉選單中就可以選到我們已經建立好的憑證。
儲存變更後,要重啟SQL服務,SQL才會用該憑證啟動歐。
要如何知道SQL有沒有使用憑證呢 ? 請開啟SQL Server記錄檔,如果有使用憑證的話,您可以看見如下圖紅色圈選處的訊息。
剛剛我們在匯出憑證時,筆者有提到匯出時記得要一併匯出私鑰,不然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
這裡我做一個小實驗,故意匯入一個不含私鑰的憑證
然後我們再到SQL的組態管理員中去看看,我們可以發現下拉選單中依然只能看見一個憑證,該無私鑰的憑證由於不符SQL的需求因此不會顯示出來。
如果要在Cluster環境下設定的話,請先使用對外服務的FQDN來建立憑證,將憑證匯入到Node後,到SQL組態管理員中我們依然看不見該憑證(原因是因為該憑證的CN我們是用對外服務的Cluster的FQDN產出的,所以CN不是Node的電腦名稱,所以無法用UI選到該憑證)。下圖為筆者故意建立一個CN為SQL1.local的憑證。
如下圖所示,我們在UI中依然看不見SQL1.local這一個憑證。
對於這一種情形我們就得透過regedit的方式來修改,我們先將UI中看不見的憑證透過下圖的步驟取出我們需要的 憑證指紋 ,並將憑證指紋貼到regedit中。複製文字時請注意憑證指紋開頭會有一個看不見的unicode,因此複製文字請直接從第一個文字直接開始複製,略過前面的空白。
該regedit的路徑為HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.x\MSSQLServer\SuperSocketNetLib\Certificate。將上一步驟複製的文字內容去掉空白後貼入(如下圖)。
完成修改regedit後,我們重啟SQL,接下來可以在SQL Server記錄檔中看見SQL已經改用我們剛剛在regedit中填入的憑證開啟服務了。
以上為筆者近日的小小心得,希望對您能有所幫助。
Rock Chang
2014/02/24
我是ROCK
rockchang@mails.fju.edu.tw