http://support.microsoft.com/kb/811889/zh-cn
本文分步介绍如何排查“Cannot generate SSPI context”错误消息最常见的根源。在下列情形中,您可能会收到此错误消息:
- 正在与 SQL Server 建立连接。
- 正在使用集成安全性。
- 使用 Kerberos 执行安全委派。
了解 Kerberos 术语和服务主体名称
客户端计算机上的 SQL Server 驱动程序利用集成安全性来使用用户帐户的 Windows 安全令牌,以便成功连接到运行 SQL Server 的计算机。Windows 安全令牌从客户端委派到运行 SQL Server 的计算机。当使用下列某一配置将用户的安全令牌从一台计算机委派到另一台计算机时,SQL Server 驱动程序就执行了这一委派:- 命名管道上的 NTLM(不使用安全支持提供程序接口 [SSPI])
- TCP/IP 套接字上的 NTLM(使用 SSPI)
- TCP/IP 套接字上的 Kerberos(使用 SSPI)
当 SSPI 使用 Kerberos 在 TCP/IP 上委派,而 Kerberos 不能完成将用户安全令牌成功委派到运行 SQL Server 的目标计算机上所必需的操作时,就会出现“Cannot generate SSPI context”错误。
安全支持提供程序接口为何选择 NTLM 或 Kerberos
Kerberos 使用一种称为服务主体名称 (SPN) 的标识符。您可以将 SPN 视为网络服务器资源中某个实例的唯一域或林标识符。您可以对一个 Web 服务、SQL 服务或 SMTP 服务使用 SPN。还可以使多个 Web 服务实例位于同一台具有唯一 SPN 的物理计算机上。SQL Server 的 SPN 由下列元素构成:
- 服务类:它标识一般的服务类。SQL Server 的服务类始终为 MSSQLSvc。
- 主机:它是运行 SQL Server 的计算机的完全限定域名 DNS。
- 端口:它是服务正在侦听的端口号。
当客户端上的 SQL Server 驱动程序使用集成安全性连接到 SQL Server 时,客户端上的驱动程序代码会尝试使用 WinSock 网络 API 来解析运行 SQL Server 的计算机的完全限定 DNS。为了执行这一操作,该驱动程序代码会调用 gethostbyname 和 gethostbyaddr WinSock API。如果计算机使用的是集成安全性,即使 IP 地址或主机名是作为运行 SQL Server 的计算机的名称传递的,SQL Server 驱动程序也仍然尝试解析计算机的完全限定 DNS。
当客户端上的 SQL Server 驱动程序解析运行 SQL Server 的计算机的完全限定 DNS 时,会使用相应的 DNS 创建该计算机的 SPN。因此,凡是与通过 WinSock 将 IP 地址或主机名解析为完全限定 DNS 的过程有关的问题,都有可能导致 SQL Server 驱动程序为运行 SQL Server 的计算机创建无效的 SPN。
例如,客户端 SQL Server 驱动程序可创建为已解析完全限定的 DNS 的无效 SPN 包括:
- MSSQLSvc/SQLSERVER1:1433
- MSSQLSvc/123.123.123.123:1433
- MSSQLSvc/SQLSERVER1.antartica.corp.mycompany.com:1433
- MSSQLSvc/SQLSERVER1.dns.northamerica.corp.mycompany.com:1433
Kerberos 身份验证成功的关键因素是网络上的 DNS 功能有效。您可以使用 Ping 命令行实用工具来验证客户端和服务器上的这一功能。在客户端计算机上,运行以下命令来获取运行 SQL Server 的服务器的 IP 地址(其中,运行 SQL Server 的计算机的名称是 SQLServer1):
ping sqlserver1
要弄清楚 Ping 命令行实用工具是否解析了 SQLServer1 的完全限定 DNS,请运行以下命令:
ping -a IPAddress
例如: