共用方式為


使用 Http.sys 註冊 Kerberos 服務主要名稱

原生 XML Web Service 已被取代。未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

當您使用 CREATE ENDPOINT 或 ALTER ENDPOINT 建立或修改 HTTP 端點時,必須指定所要使用的驗證類型,才能驗證將 HTTP SOAP 要求傳送給端點的使用者。如需詳細資訊,請參閱<CREATE ENDPOINT (Transact-SQL)>和<ALTER ENDPOINT (Transact-SQL)>。

藉由使用 CREATE ENDPOINT ALTER ENDPOINT,您可以用下列方式將結束點設定為支援 Kerberos 驗證:

  • 藉由設定 AUTHENTICATION=KERBEROS,Kerberos 會被用來當作進行 HTTP 驗證的唯一方式

  • 當 AUTHENTICATION=INTEGRATED 時,結束點的 HTTP 驗證可以提供下列選項來作為驗證挑戰的一部份:NEGOTIATE、KERBEROS 和 NTLM。針對 NEGOTIATE 選項,用戶端和伺服器會嘗試建立 Kerberos 式的驗證。如果用戶端不支援 Kerberos,或根本無法進行交涉,則會迫使驗證回到 NTLM。若要在使用 NEGOTIATE 時,避免迫使用戶端回到 NTLM,建議用戶端在結束點上設定 AUTHENTICATION=KERBEROS。

若要在 Kerberos 下支援相互驗證,SQL Server 的執行個體必須將服務主要名稱 (SPN) 與執行時所使用的帳戶 (例如本機系統帳戶或網域使用者帳戶) 產生關聯。由特定 SQL Server 執行個體所進行之 SPN 註冊的特定詳細資料,是由設定執行個體時所使用的服務帳戶類型所決定。如果 SQL Server 是使用本機系統帳戶或網路服務帳戶所執行,SPN 一定是註冊在電腦名稱之下。如果 SQL Server 是使用網域使用者帳戶所執行,SPN 一定是註冊在網域使用者名稱之下。

使用 SetSPN.exe

若要在 SPN 與 SQL Server 執行個體執行時所使用的帳戶之間啟用關聯,請使用 Windows SetSPN.exe 支援工具。這項工具會在 Active Directory 中的 Windows 網域服務使用者帳戶之下,為 SQL Server 執行個體執行所在的電腦名稱加入 SPN。在這種狀況下,SetSPN.exe 工具可用來加入兩個 SPN:一個針對 NetBIOS 名稱,而另一個則針對完整 DNS 名稱。

例如,如果 SetSPN.exe 工具是從 MyComputer 上執行的 SQL Server 執行個體執行,則下列兩個 SPN 會與 SQL Server 執行個體執行時所使用的帳戶產生關聯,而且必須加入到目錄:

HTTP/MyComputer;
HTTP/MyComputer.fully.qualified.domain.name.com

請注意,一個帳戶可以有多個 SPN,但一個 SPN 只能針對一個帳戶註冊。

若要刪除這兩個 SPN 名稱 (NetBIOS 和完整 DNS),同樣請使用 SetSPN.exe。

考量因素

  • 與 Httpcfg.exe 類似,SetSPN.exe 可從 Windows Server 2003 取得,而其安裝程序就跟安裝 Httpcfg.exe 和其他 Windows 支援工具相同。如需詳細資訊,請參閱<設定 HTTP 核心模式驅動程式 (Http.sys)>。

  • 如果 SQL Server 執行個體不是以本機系統帳戶執行,則只有具備 DOMAIN ADMIN 權限的整合式驗證使用者可以使用 SetSPN.exe 工具來變更 SPN 註冊。

  • 如果 SQL Server 執行個體是以本機系統帳戶執行,則只有 SQL Server系統管理員 (sysadmin) 固定伺服器角色的成員可以使用 SetSPN.exe 工具變更 SPN 註冊。

  • 如果服務帳戶是本機系統,則不必使用 SetSPN.exe 工具,就可以將 SPN 加入電腦的 Active Directory 帳戶。

SetSPN.exe 的語法

SetSPN.exe 的語法為:

setspn { -ASPN | -DSPN | -L } service_account

引數

  • -A
    在帳戶中加入指定的 SPN。

  • -D
    在帳戶中刪除指定的 SPN。

  • -L
    列出帳戶中所有已註冊的 SPN。

範例

如果 SQL Server 執行個體是在名為 MySQLHost 的電腦上以網域使用者 (MyDomain\MySQLAccount) 執行,則可使用下列命令設定適當的 SPN:

setspn –A http/MySQLHost MyDomain\MySQLAccount
setspn –A http/MySqlHost.Mydomain.Mycorp.com MyDomain\MySQLAccount

請注意,一個帳戶可以有多個 SPN (每個針對不同的服務或主機名稱),但一個 SPN 只能在一個帳戶中註冊。在多個帳戶中註冊相同的 SPN,會造成 Kerberos 驗證失敗。

例如,帳戶 MyDomain\MySQLAccount 中可以註冊下列幾個不同的 SPN。前兩個命令是針對兩個不同的服務 (http 和 rpc)。最後一個命令則是針對不同的主機名稱 (此處假設電腦有多個主機名稱)。

setspn –A http/MySQLHost MyDomain\MySQLAccount
setspn –A rpc/MySQLHost MyDomain\MySQLAccount
setspn –A http/MySecondHost MyDomain\MySQLAccount

相反的,下列狀況將會造成 Kerberos 失敗:

setspn –A http/MySQLHost MyDomain\MySQLAccountOne
setspn –A http/MySQLHost MyDomain\MySQLAccountTwo

會發生失敗情形,是因為電腦上有兩個 SQL Server 執行個體分別使用不同的服務帳戶執行 (MySQLAccountOne 和 MySQLAccountTwo)。同時為這兩個 SQL Server 執行個體各註冊一個 SPN 是不支援的狀況。

遇到相同的電腦上有多個 SQL Server 執行個體使用不同帳戶執行時,也是相同的道理。SPN 只能針對一個帳戶註冊。如果您需要多個 SQL Server 執行個體 (例如 Inst1Inst2) 同時存在以供其他應用程式 (例如 IIS) 使用,而且想讓所有服務都使用 HTTP Kerberos 驗證,請使用下列其中一個選項來解決 SPN 註冊衝突:

  • 使所有的執行個體和應用程式以相同的帳戶執行。

    例如,使 Inst1Inst2 和 IIS 全都以 LocalSystem 或 Mydomain\MyServiceAccount 執行。

  • 為相同的電腦註冊多個主機名稱,並使每個執行個體與應用程式接聽不同的主機。因此,在這個範例中,您必須執行下列動作:

    • 為電腦建立三個不同的主機名稱。

    • 將每個主機指派給不同的應用程式。

    • 註冊三組 SPN,每組各針對一個主機名稱/應用程式組合。

Kerberos SPN 註冊問題疑難排解

Kerberos SPN 註冊最常見的疑難排解問題如下:

  • SPN 未註冊。

    SPN 未註冊時,Kerberos 驗證將會在 SQL Server 執行個體執行所在的本機電腦上運作,但在遠端用戶端電腦上會失敗。

  • SPN 註冊次數超過一次。

    管理員在網域目錄中重複註冊服務主要名稱 (SPN) 因而造成 Kerberos 驗證失敗的狀況有數種。這些功能包括下列項目:

    • 變更 SQL Server 執行個體執行時所使用的網域帳戶

      如果執行 SetSpn.exe 時,SQL Server 執行個體是以一個網域帳戶 (例如 DOMAIN\User1) 執行,而用來執行 SQL Server 的帳戶 (例如 DOMAIN\User2) 後來遭到變更,則再次執行 SetSPN.exe 時將會造成目錄下的兩個帳戶中都插入相同的 SPN。

    • 安裝使用不同帳戶執行的多個 SQL Server 執行個體

      如果您安裝多個 SQL Server 執行個體,然後使用不同的帳戶執行每個執行個體,則在每個執行個體上執行 SetSpn.exe 時,目錄中每個 SQL Server 服務帳戶之下都會有重複的帳戶。這個情況對於使用網域使用者和本機系統帳戶執行的執行個體都適用。

    • 移除 SQL Server 執行個體後又使用不同的帳戶重新安裝

      如果您使用一個帳戶安裝 SQL Server、註冊 SPN、移除 SQL Server 後,又使用不同的帳戶重新安裝,然後重新註冊 SPN,則每個帳戶都會有相同的 SPN。這表示 SPN 會重複。

在上述這些狀況中,問題在於 HTTP 結束點將會回到 NTLM 驗證,直到問題解決為止。若要解決問題,您通常需要在目錄中搜尋重複或過時的 SPN,然後手動移除它們。