目标主体名称不正确.无法生成SSPI上下文

The*_*dge 56 sql-server tfs spn kerberos sspi

我正在努力获得从机器A到运行SQL Server的机器B的SQL Server连接.

我已经广泛搜索了所有我发现的东西都没有用.他们也没有引导你逐步解决这个问题.

我们不使用Kerberos,而是使用配置的NTLM.

在此输入图像描述

涉及的机器是(xx用于隐藏某些机器名称以用于安全目的):

  • xxPRODSVR001 - Windows Server 2012域控制器
  • xxDEVSVR003 - Windows Server 2012(此机器正在生成错误)
  • xxDEVSVR002 - Windows Server 2012(此计算机正在运行SQL Server 2012)

以下SPN已在DC(xxPRODSVR001)上注册.出于安全考虑,我用yyy模糊了域名:

已注册的ServicePrincipalNames为CN = xxDEVSVR002,CN = Computers,DC = yyy,DC = local:

            MSSQLSvc/xxDEVSVR002.yyy.local:49298

            MSSQLSvc/xxDEVSVR002.yyy.local:TFS

            RestrictedKrbHost/xxDEVSVR002

            RestrictedKrbHost/xxDEVSVR002.yyy.local

            Hyper-V Replica Service/xxDEVSVR002

            Hyper-V Replica Service/xxDEVSVR002.yyy.local

            Microsoft Virtual System Migration Service/xxDEVSVR002

            Microsoft Virtual System Migration Service/xxDEVSVR002.yyy.local

            Microsoft Virtual Console Service/xxDEVSVR002

            Microsoft Virtual Console Service/xxDEVSVR002.yyy.local

            SMTPSVC/xxDEVSVR002

            SMTPSVC/xxDEVSVR002.yyy.local

            WSMAN/xxDEVSVR002

            WSMAN/xxDEVSVR002.yyy.local

            Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/xxDEVSVR002.yyy.local

            TERMSRV/xxDEVSVR002

            TERMSRV/xxDEVSVR002.yyy.local

            HOST/xxDEVSVR002

            HOST/xxDEVSVR002.yyy.local
Run Code Online (Sandbox Code Playgroud)

已注册的ServicePrincipalNames为CN = xxDEVSVR003,CN = Computers,DC = yyy,DC = local:

            MSSQLSvc/xxDEVSVR003.yyy.local:1433

            MSSQLSvc/xxDEVSVR003.yyy.local

            Hyper-V Replica Service/xxDEVSVR003

            Hyper-V Replica Service/xxDEVSVR003.yyy.local

            Microsoft Virtual System Migration Service/xxDEVSVR003

            Microsoft Virtual System Migration Service/xxDEVSVR003.yyy.local

            Microsoft Virtual Console Service/xxDEVSVR003

            Microsoft Virtual Console Service/xxDEVSVR003.yyy.local

            WSMAN/xxDEVSVR003

            WSMAN/xxDEVSVR003.yyy.local

            TERMSRV/xxDEVSVR003

            TERMSRV/xxDEVSVR003.yyy.local

            RestrictedKrbHost/xxDEVSVR003

            HOST/xxDEVSVR003

            RestrictedKrbHost/xxDEVSVR003.yyy.local

            HOST/xxDEVSVR003.yyy.local
Run Code Online (Sandbox Code Playgroud)

现在,如果只有SQL Server错误消息更具描述性,并告诉我它尝试连接的主要名称,我可能能够诊断出来.

那么,任何人都可以指导我如何解决这个问题,或者你能看到我所提供的任何错误吗?

我很乐意生成更多的调试信息,告诉我你需要什么.

Slo*_*rio 31

我正在使用的ASP.NET MVC应用程序遇到此问题.

我意识到我最近更改了密码,我能够通过注销并重新登录来修复它.


Ana*_*ich 22

我花了大约几个小时来解决同样的问题.原来,这"Integrated Security=true"导致了问题.

尝试从连接字符串中删除此参数.

  • 好吧,显然删除`Integrated Security` _will_会阻止此错误,因为尝试使用Windows凭据登录时会发生错误.不幸的是,大多数情况下,您_want_能够使用您的Windows凭据登录! (13认同)
  • @GeoffDawdy我下面的回答可能有帮助?这是由于密码过期,要求我更改密码,注销并重新登录,然后一切正常。 (2认同)
  • 节省时间并运行此工具:https://www.microsoft.com/zh-cn/download/details.aspx?id=39046&WT.mc_id=soc-n- [TR] -loc- [服务]-[farukc ] (2认同)

Sar*_*rah 15

SSPI 上下文错误明确表示正在尝试使用Kerberos 进行身份验证。

由于 Kerberos 身份验证SQL Server 的 Windows 身份验证依赖于 Active Directory,这需要您的计算机和网络域控制器之间的关系,因此您应该首先验证该关系。

您可以通过以下 Powershell 命令Test-ComputerSecureChannel快速检查这种关系。

Test-ComputerSecureChannel -Verbose
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果它返回False,您必须修复您的计算机 Active Directory 安全通道,因为没有它,您的计算机外部就无法进行域凭据验证。

您可以通过以下Powershell命令修复您的计算机安全通道:

Test-ComputerSecureChannel -Repair -Verbose
Run Code Online (Sandbox Code Playgroud)

如果上述方法不起作用(因为您的域凭据不起作用,因为机器不受信任),您可以NETDOM RESET从提升的cmd.exe(不是 PowerShell)提示中使用:

NETDOM RESET %COMPUTERNAME% /UserO:domainAdminUserName /Password0:* /SecurePasswordPrompt
Run Code Online (Sandbox Code Playgroud)

(是的,命令行参数确实有一个O( Capital-"Oh",而不是零0)。该/Password0:* /SecurePasswordPrompt选项将使用凭据弹出窗口,而不是让您直接在命令行中输入密码,而您绝不能这样做) .

检查安全事件日志,如果您使用的是 kerberos,您应该会看到使用身份验证包的登录尝试:Kerberos。

NTLM 身份验证可能失败,因此正在尝试进行 kerberos 身份验证。您可能还会在安全事件日志中看到 NTLM 登录尝试失败?

您可以在 dev 中打开 kerberos 事件日志记录以尝试调试 kerberos 失败的原因,尽管它非常冗长。

Microsoft 的SQL ServerKerberos 配置管理器可以帮助您快速诊断和修复此问题。

这是一个值得一读的好故事:http : //houseofbrick.com/microsoft-made-an-easy-button-for-spn-and-double-hop-issues/

  • 请注意,PowerShell Core 中不存在“Test-ComputerSecureChannel”。 (3认同)
  • 对我来说问题是时间偏差。域控制器和数据库服务器有 45 分钟的时间偏差。设置正确的时间修复了它。 (2认同)

Mat*_*erd 15

使用Windows身份验证通过SQL Server Management Studio进行连接时收到此错误.我的密码已过期,但我还没有更改.一旦更改,我就必须注销并重新登录,以便机器使用我的新凭据工作.


小智 9

我使用PIN而不是密码登录Windows 10.我退出并使用我的密码重新登录,并能够通过Management Studio进入SQL Server.

  • 糟糕,这不是它.当我没有看时,SSMS对我进行了切换并返回到我的SQL Server帐户.但我终于尝试从使用Microsoft帐户切换到本地登录到本地使用本地帐户.这就行了,即使我使用我的PIN登录,它现在似乎也能正常工作. (2认同)

Abu*_*ood 7

尝试通过Windows身份验证时,我遇到了同样的错误.听起来很荒谬,但万一它可以帮助别人:这是因为我的域名帐户在我登录时被某种方式锁定了(!).解锁帐户修复它.


Ale*_*lex 7

只是为这个最模糊的错误添加另一个潜在的解决方案The target principal name is incorrect. Cannot generate SSPI context. (.Net SqlClient Data Provider):

验证ping SQL Server时解析的IP是否与Configuration Manager中的IP相同.要检查,请打开SQL Server配置管理器,然后转到SQL Server网络配置> MSSQLServer的协议> TCP/IP.

确保已启用TCP/IP,并在"IP地址"选项卡中,确保ping时服务器解析的IP与此处相同.这为我修复了这个错误.


mxa*_*sim 7

就我而言,重新启动 SQL Server 2014(在我的开发服务器上)解决了该问题。


use*_*590 7

该问题似乎是 Windows 凭据问题。我在使用 VPN 的工作笔记本电脑上遇到了同样的错误。我应该以我的域/用户名登录,这是我在直接连接时成功使用的,但是一旦我移动到具有另一个连接的 VPN,我就会收到此错误。我认为这是一个 DNS 问题,因为我可以 ping 服务器,但事实证明我需要在命令提示符下以我的用户身份显式运行 SMSS。

例如 runas /netonly /user:YourDoman\YourUsername "C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe"


Nat*_* S. 7

这通常是由于服务主体名称 (SPN) 缺失、不正确或重复造成的

解决步骤:

  1. 确认 SQL Server 使用的 AD 帐户
  2. 在Powershell或CMD中以管理员模式运行以下命令(服务帐户不应包含域)
setspn -L <ServiceAccountName> | Select-String <ServerName> | select line
Run Code Online (Sandbox Code Playgroud)
  1. 确保返回的输出包含完全限定、非完全限定、带端口和不带端口的 SPN。

    预期输出:

    Registered ServicePrincipalNames for CN=<ServiceAccountName>,OU=CSN Service Accounts,DC=<Domain>,DC=com: 
    MSSQLSvc/<ServerName>.<domain>.com:1433
    MSSQLSvc/<ServerName>:1433                                           
    MSSQLSvc/<ServerName>.<domain>.com
    MSSQLSvc/<ServerName>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您没有看到上述所有内容,请在管理员模式下在 PowerShell 或 CMD 中运行以下命令(如果您不使用默认的 1433,请确保更改端口)

SETSPN -S  MSSQLSvc/<ServerName> <Domain>\<ServiceAccountName> 
SETSPN -S  MSSQLSvc/<ServerName>.<Domain> <Domain>\<ServiceAccountName> 
SETSPN -S  MSSQLSvc/<ServerName>:1433 <Domain>\<ServiceAccountName> 
SETSPN -S  MSSQLSvc/<ServerName>.<Domain>:1433 <Domain>\<ServiceAccountName>
Run Code Online (Sandbox Code Playgroud)
  1. 上述完成后,DNS 传播通常需要几分钟

此外,如果您收到有关找到重复 SPN 的消息,您可能需要删除它们并重新创建它们


Dan*_*ley 6

检查客户端和服务器之间的时钟是否匹配。

当我间歇性地出现此错误时,上述答案均无效,然后我们发现某些服务器上的时间发生了漂移,一旦它们再次同步,错误就消失了。搜索 w32tm 或 NTP 以了解如何在 Windows 上自动同步时间。


EM0*_*EM0 5

我刚刚遇到了这个问题并通过做两件事来修复它:

  1. 使用 ADSI Edit 向服务帐户授予读/写 servicePrincipalName 权限,如https://support.microsoft.com/en-us/kb/811889 中所述
  2. 使用删除先前存在于 SQL Server计算机帐户(而不是服务帐户)上的 SPN

    setspn -D MSSQLSvc/HOSTNAME.domain.name.com:1234 HOSTNAME
    
    Run Code Online (Sandbox Code Playgroud)

    其中1234是实例使用的端口号(我的不是默认实例)。


Fra*_*ain 5

登录到您的SQL Box和客户端,然后键入:

ipconfig /flushdns
nbtstat -R
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请在客户端计算机上更新您的DHCP。这适用于我们办公室中的两台PC。

  • 在我的客户端机器和 SQL 框上做了你的回答,加上我的客户端机器上的“ipconfig/release”和“ipconfig/renew”,但它对我不起作用;( (2认同)

小智 5

我正在隔离网络中的一组 PC 上测试 IPv6,当我恢复 IPv4 时遇到了这个问题。我一直在活动目录、DNS 和 DHCP 中进行操作,所以不知道我是用什么手段来破坏 Kerberos 设置的。

我使用这个有用的提示在我的软件之外重新测试了连接,以连接我发现的远程连接。

https://blogs.msdn.microsoft.com/steverac/2010/12/13/test-remote-sql-connectivity-easily/

然后经过简短的搜索,在 Microsoft 网站上找到了这个 https://support.microsoft.com/en-gb/help/811889/how-to-troubleshoot-the-cannot-generate-sspi-context-error-message

在 SQL 服务器上运行该工具,查看是否存在任何问题,如果状态显示错误,则点击出现的修复按钮。

这为我解决了问题。


Slo*_*rio 5

如果有人想知道,我整理了 MS 术语:

Target = (active directory) target

Active directory target = target server running the domain controller

Domain controller = server that verifies your login information

Principal name = your windows username

SSPI = security support provider interface

Security support provider interface = software interface that manages "authenticated 
communications" and allows SSPs like TLS to allow SSL, among others

SSP = security support provider (SSPI implementation)

TLS/SSL = you should already know this
 
Run Code Online (Sandbox Code Playgroud)

= 无法验证您的密码。