﻿# 如何設定 SQL Server 2008 接受 SSL 加密連接 (需設定憑證)

最近在研究如何讓 SQL Server 用戶端程式能夠連接到 SQL Server 2008 時能夠採用 SSL 加密連線，卻發現網路上很難找資料，找到的大多是 SQL Server 2000 或 2005 的說明，而 SQL Server 2008 的說明卻經常不夠完整，在 [TechNet](http://technet.microsoft.com/zh-tw/ms376608.aspx) 網站也非常難找到正式的教學文件告知怎樣設定，研究了兩天後終於研究出正確設定的標準作業流程，真是太開心了！^\_^

當你使用 Management Studio 連接 SQL Server 時，其實所有從用戶端到伺服器之間的資料，包括 T-SQL 與回傳的資料都是明碼 (Plain Text)，走的是 [TDS](http://en.wikipedia.org/wiki/Tabular_Data_Stream) 通訊協定，如要做到網路層級的資安，則必須從用戶端與伺服器端都啟用 SSL 加密連接才行，伺服器這端的設定比較麻煩，必須先申請憑證並設定讓 SQL Server 使用這個憑證才行。用戶端的話，那就簡單很多，文章稍後都會提到。

**§ 申請 SQL Server 2008 所需的「電腦憑證」**

由於我的電腦是為於 AD 網域環境中，因此申請電腦憑證的步驟較為簡單，如下所示：

1\. 開啟 MMC 介面並新增**本機電腦**的 \[**憑證**\] 嵌入式管理單元 ( 可參考[此文章](/post/2010/03/02/The-Complete-Guide-for-Purchase-Install-SSL-Certificate-to-IIS7.aspx)的 第 5 步：匯入中繼憑證 )

-   先使用 \[開始\] / \[執行\] 並輸入 mmc 開啟主控台，並選取 \[檔案\] / \[新增/移除嵌入式管理單元\] 功能
-   選取 \[憑證\] 管理單元點選 \[新增\] 按鈕，然後選取 \[電腦帳戶\] 選項，按下 \[下一步\] 按鈕
-   再按 \[完成\] 按鈕，再按下 \[確定\] 按鈕加入主控台。

2\. 在 \[個人\] 資料夾按滑鼠右鍵 / \[所有工作\] / \[要求新憑證\]

    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/568fce89bececd4ee5ee-image_1656.png)

3\. 透過 AD 網域內的憑證伺服器幫忙產生 SQL Server 這台電腦所需的 **電腦憑證**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5331eb2033fc03b2634e-SNAGHTML1add292.png)

如果你沒看到 **Active Directory 註冊原則**的話，那麼你無法透過這種方式取得電腦憑證：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/90c5e00a301cb6d05e53-SNAGHTML1aec337.png)

請勾選「電腦」，並按下「註冊」按鈕即可註冊成功

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b00b7a0b3989166f5ae2-SNAGHTML1b13b15.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/de9d01c74b3f995c716c-SNAGHTML1b1eaa5.png)

此時你會看到該電腦的憑證已經被建立成功：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0ce92fc5c343e196c5dc-image_1657.png)

同一筆資料往後看還有些欄位，在「預定目的」的部分一定要有 **用戶端驗證** 與 **伺服器驗證** 這兩個

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4b312dc313cefc07b0df-image_1658.png)

**§ 開啟** **SQL Server 組態管理員，並設定 SQL Server 2008 所要使用的電腦憑證**

1\. 開啟 SQL Server 組態管理員，展開 SQL Server 網路組態在，並設定底下各項目的通訊協定內容  
**註**：如果一台電腦安裝多個不同的 SQL Server Instance 的話，會有多筆可以設定。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/619270b0f4a7fd228e09-image_1659.png)

2\. 設定是否要讓所有 SQL Server 用戶端連接都要 **強制加密**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/219d607c168ff08aca1b-SNAGHTML1ba942c.png)

3\. 選取你剛剛所申請到的電腦憑證  
**注意**：如果你找不到任何憑證可選的話，那代表你的所有憑證儲存區裡沒有 **用戶端驗證** 與 **伺服器驗證** 這兩個預定目的的憑證！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/91f9c102a823d7c9c6a8-SNAGHTML1bc7344.png)

4\. 按下 \[確定\] 後會要求你重新啟動服務

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4a06174d6220b679fd09-SNAGHTML1bec5d6.png)

5\. 此時我們可以直接利用 SQL Server 組態管理員 來重新啟動 SQL Server 服務。不過，如果你的 SQL Server 服務使用 **NT AUTHORITY\\NETWORK SERVICE** 身份來啟動的話，就會立刻看到以下錯誤：

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/55cf8b35ea042a30dd79-image_thumb_95.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/85583544f7e8eb1c3fb6-image_1660.png)  
( 註: 點圖可放大顯示 )

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d99b8d8779b13ba2e1e7-SNAGHTML1c5548e_thumb.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4b71b1697f5213785451-SNAGHTML1c5548e.png)

中英文錯誤訊息如下： ( [MSSQLSERVER\_26014](http://technet.microsoft.com/zh-tw/library/cc280600\(SQL.100\).aspx) )

-   **無法載入使用者專屬的憑證。伺服器將不會接受連接。您應該確認已正確安裝憑證。請參閱線上叢書中的＜設定憑證給 SSL 使用＞(Configuring Certificate for Use by SSL)。**
-   **Unable to load user-specified certificate. The server will not accept a connection. You should verify that the certificate is correctly installed. See "Configuring Certificate for Use by SSL" in Books Online.**

**§ 修正「電腦憑證」的私鑰存取權限**

由於我們先前註冊的電腦憑證預設只允許給 **SYSTEM** 與 **Administrators** 讀取憑證的私鑰，因此 SQL Server 服務在啟動時嘗試讀取該憑證的私鑰時便會發生「無法載入使用者指定的憑證」錯誤，以致於 SQL Server 無法正常啟動，而解決的辦法就是回到**憑證**管理主控台，重新指派其適合的權限給 SQL Server 啟動服務使用！

在設定金鑰的權限之前，請不要直接授權給 **NT AUTHORITY\\NETWORK SERVICE**，因為這不是最理想的設定方法，比較理想的設定對象應該是 SQL Server 內建的兩個管理群組，如下圖所示，每當安裝完 SQL Server 後預設都會有兩個管理群組可用，這群組名稱每台電腦都不太一樣，你可能要找一下才知道是哪個，其命名規則如下：

-   SQLServerMSSQLUser$\[電腦名稱\]$\[實體名稱\]
-   SQLServerSQLAgentUser$\[電腦名稱\]$\[實體名稱\]

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/00252681a8254719f352-SNAGHTML1ca301d.png)

以上圖為例，其中 **SQLServerMSSQLUser$Will7PC$SQL2008** 就是我們要設定的目標！

接著我們回到 MMC 憑證管理主控台，將剛剛註冊好的憑證修改其權限。

在憑證上按滑鼠右鍵，選擇 \[**所有工作**\] / \[**管理私密金鑰**\]

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8685df2e07745fa55720-image_1661.png)

接著加入 **SQLServerMSSQLUser$Will7PC$SQL2008** 群組即可：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1b93bb7b64b4d02e3b24-SNAGHTML1d10518.png)

最後我們再次回到 SQL Server 組態管理員 來啟動 SQL Server 服務，此時就不會再遇到錯誤了！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1f4d47b5b7e8012c8727-image_1662.png)

**§ 設定 SQL Server Management Studio 使用加密連接**

開啟 Management Studio 之後，只要切換到「連接屬性」頁籤，勾選「加密連接」即代表用戶端將使用 SSL 加密連接 SQL Server 伺服器。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5aa22ce22eeeb0fea42c-image_1663.png)

如果你從**本機**連接 SQL Server 或是用**網域內的電腦**遠端連線到 SQL Server，通常不會有太大問題，但請記得要用電腦名稱的 FQDN 來連線 (在網域中可以只用電腦名稱連接，因為網域中電腦的預設網路設定會自動幫你加上 DNS 尾碼)，不要再用 IP 連接 SQL Server，不然你會遇到以下問題：

-   憑證的 CN 名稱不符合傳遞值

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c1f4f016472c733e4067-image_thumb_96.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/df689ecce54b6510cf8f-image_1664.png)

如果你從**非網域**的電腦連接的話，通常也會遇到「**此憑證鏈結是由不受信任的授權單位發出的。**」這個錯誤訊息：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ce308bc5a020e427c3b9-image_1665.png)

這是因為用戶端電腦無法信任遠端這台 SQL Server 的電腦憑證，無法信任的原因是你的用戶端沒有信任負責簽發這張憑證的的根憑證，你只要設法將網域中的**根憑證**匯入到用戶端電腦，就能夠正常連接了！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d320b6741b12ace78b53-SNAGHTML1e5b840.png)

**§ 設定你的 .NET 應用程式使用 SSL加密連接**

這部份最簡單，只要修改連線字串 (Connection Strings) 即可完成設定，程式碼完全不用改！

以下是一些連線字串的範例：

**ODBC**

```
Driver=SQLServer;Server=ServerNameHere;UID=UserIdHere;PWD=PasswordHere;Network=DBNETLIB.DLL;Encrypt=YES
```

**OLEDB**

```
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=dbNameHere;Data Source=ServerNameHere;Use Encryption for Data=True
```

**SQL Server Native Client 10.0 ODBC Driver**

```
Driver={SQL Server Native Client 10.0};Server=myServerAddress;Database=myDataBase; Trusted_Connection=yes;Encrypt=yes
```

通常 .NET 應用程式大多使用 SQL Server Native Client 來連接資料庫，所以簡單來說，你只要在連線字串最後加上 **;Encrypt=yes** 即可完成設定！

**相關連結**

-   [加密 SQL Server 的連接](http://technet.microsoft.com/zh-tw/ms189067.aspx)
-   [啟用 Database Engine 的加密連接 (SQL Server 組態管理員)](http://technet.microsoft.com/zh-tw/ms189067.aspx)
-   [INF: Permissions required for SQL Server Service account to use SSL certificate](https://learn.microsoft.com/en-us/archive/blogs/sqlserverfaq/inf-permissions-required-for-sql-server-service-account-to-use-ssl-certificate)
-   [SQL: SSL and SQL Server 2008 – Service Doesn't Start – Error Code 26014](http://nickstips.wordpress.com/2010/09/08/sql-ssl-and-sql-server-2008-service-doesnt-start-error-code-2146885628/)
-   [SSL Encryption in SQL Server 2008 R2](https://web.archive.org/web/20141220175920/http://www.infotechguyz.com/SQLServer2008/SSLEncryptioninSQLServer2008R2.html)
-   [SSL Encryption in SQL Server](http://www.techbubbles.com/sql-server/ssl-encryption-in-sql-server/)
-   [Enabling Certificate for SSL on a SQL Server 2005 Clustered Installation](https://learn.microsoft.com/en-us/archive/blogs/jorgepc/enabling-certificate-for-ssl-on-a-sql-server-2005-clustered-installation)
-   [Encrypting connections in SQL Server 2005 & SQL Native Client with SSL](https://learn.microsoft.com/en-us/archive/blogs/sql_protocols/encrypting-connections-in-sql-server-2005-sql-native-client-with-ssl)
-   [Encrypting Connections to SQL Server](http://msdn.microsoft.com/en-us/library/ms189067\(SQL.105\).aspx)
-   [How to enable SSL encryption for an instance of SQL Server by using Microsoft Management Console](https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/configure-sql-server-encryption)
-   [How to enable SSL encryption for SQL Server 2000 if you have a valid Certificate Server](https://web.archive.org/web/20100707094250/http://support.microsoft.com:80/kb/276553)
-   [How SQL Server uses a certificate when the Force Protocol Encryption option is turned on](https://web.archive.org/web/20140807144655/http://support.microsoft.com/kb/318605)
-   [Configuring Certificate for Use by SSL](http://msdn.microsoft.com/en-us/library/ms186362\(SQL.105\).aspx)
-   [SSL Certificates and Naming](http://social.msdn.microsoft.com/Forums/en/sqlsecurity/thread/00ccbd16-78fb-40eb-8be6-98316a18294f)
-   [MSSQLSERVER\_26014](http://technet.microsoft.com/zh-tw/library/cc280600\(SQL.100\).aspx)
-   [BUG: You cannot enable encryption by using a certificate when SQL Server 2005 is running under the Network Service account](https://web.archive.org/web/20141220175705/http://support.microsoft.com/kb/900495/en-us)
-   [Connection strings for SQL Server 2008](http://www.connectionstrings.com/sql-server-2008)
-   [Tabular Data Stream - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Tabular_Data_Stream)
