在我的服务器(托管 SQLS 服务器)和我的电脑中,我在 hosts 文件中都有以下条目:
我正在使用 Windows 身份验证登录 SSMS。
在我的电脑上的 SSMS 中使用服务器名MYSQLSERVER
,我可以毫无问题地登录,但如果我在 SSMS(在服务器中)中尝试相同操作,则会出现此错误:
TITLE: Connect to Server
------------------------------
Cannot connect to MYSQLSERVER.
------------------------------
ADDITIONAL INFORMATION:
Login failed. The login is from an untrusted domain and cannot be used with Integrated authentication. (Microsoft SQL Server, Error: 18452)
For help, click: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-18452-database-engine-error
------------------------------
BUTTONS:
OK
------------------------------
127.0.0.1 MYSQLSERVER
我尝试用 和替换 hosts 文件中的 ip,::1 MYSQLSERVER
但问题还是一样。
我需要能够使用 hosts 文件中的主机名登录服务器上的 SSMS - 而不是使用 localhost 或真实服务器名。
知道我做错了什么吗?
Windows 身份验证 (Kerberos) 始终要求客户端指定的服务器名称与 KDC 中存在的主体相匹配。虽然它的工作方式与 TLS 不同,但它可以与 TLS 要求名称与证书相匹配的方式进行比较(除了没有绕过选项,因为 Kerberos 使用服务器名称来检索正确的密钥)。
例如,在您的例子中,客户端尝试获取 的票证。如果 KDC 无法将其与已知服务密钥关联,它将无法颁发服务认为可接受的身份验证票证。
MSSQLSvc/[email protected]
使用 Active Directory 作为 KDC,如果您想使用自定义名称,则需要在服务帐户中将其注册为 SPN(服务主体名称),例如使用
setspn
。Microsoft 恰好有关于此主题的 SQL Server 专门文档,尽管对于任何基于 Kerberos 的服务来说,它大致相同。如果您的 PC 不是域成员(并且也没有被明确告知使用 Kerberos),那么它将使用安全性较低的 NTLM,而这种 NTLM 几乎不受 SPN 要求的影响。
建议:
Microsoft 的SQL Server 客户端连接文档建议可以将自定义 SPN 设置为连接字符串的一部分。也就是说,如果服务器实际上名为
TESTSERV
,那么您可能能够使用ServerSPN=MSSQLSvc/TESTSERV
。使用不同的手段阻止对测试服务器的访问,例如防火墙规则,或者限制允许哪些 SQL Server 帐户登录(这样您的测试帐户可以登录,但真实用户不能登录)。