gss_acquire_cred 返回密钥表条目未找到错误

Vag*_*err 2 apache authentication kerberos

我一直在尝试遵循这篇 Microsoft 文章中的指南,使用 Kerberos 和 AD 对 Apache 进行身份验证。我已经用kinit成功测试了apache服务器和AD服务器之间的通信。但是,当我尝试使用 IE 访问服务器上的受限页面时,出现内部服务器错误,并且 apache 错误日志中出现以下内容。

[Wed Sep 24 14:18:15 2008] [debug] src/mod_auth_kerb.c(1483): [client 172.31.37.38] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
[Wed Sep 24 14:18:15 2008] [debug] src/mod_auth_kerb.c(1174): [client 172.31.37.38] Acquiring creds for HTTP/srvnfssol1.dev.local@DEV.LOCAL
[Wed Sep 24 14:18:15 2008] [error] [client 172.31.37.38] gss_acquire_cred() failed: Miscellaneous failure (see text) (Key table entry not found)
Run Code Online (Sandbox Code Playgroud)

我已经在 apache 进程上运行了 truss 并确认它实际上加载了 keytab 文件。我想知道 keytab 文件的格式是否有问题......

HTTP/srvnfssol1.dev.local@DEV.LOCAL
Run Code Online (Sandbox Code Playgroud)

但我不确定我错过了什么。或者还有什么要检查的。

有什么建议么?

谢谢

彼得

dav*_*pcj 5

好的。密钥表应该包含服务主体名称(在本例中为“HTTP/srvnfssol1.dev.local@DEV.LOCAL”)和加密密钥。我看到 MS 文档说只是将其回显到文件中,但我认为这是不对的。

您需要使用 ktpass 实用程序来创建密钥表。MS 文档在这里

特别是,您需要指定KRB5_NT_SRV_HST,并且大多数其余选项可以是默认的。

我的机器上的示例:

C:\>ktpass /out test.keytab /princ HTTP/srvnfssol1.dev.local@DEV.LOCAL 
           /ptype KRB5_NT_SRV_HST /pass *
Type the password for HTTP/srvnfssol1.dev.local:
Key created.

Output keytab to test.keytab:

Keytab version: 0x502
keysize 62 HTTP/srvnfssol1.dev.local@DEV.LOCAL 
ptype 3 (KRB5_NT_SRV_HST) vno 1 etype 0x1 (DES-CBC-CRC) 
keylength 8 (0xa7f1fb38041c199e)
Run Code Online (Sandbox Code Playgroud)

如果 Active Directory 服务器是 KDC,则需要使用参数/map <name>,其中<name>是 Active Directory 中代表服务器的计算机帐户。

关于这一切如何运作的一些细节。当您浏览该网站时,它应该使用 WWW-Authenticate: Negotiate 标头进行响应,并且您的浏览器将向 KDC(活动目录服务器)发送请求以获取该服务的 kerberos 票证。AD 服务器将使用服务主体名称查找票证的加密密钥,并将加密的服务票证发送回浏览器。一旦浏览器获得服务票证,它将使用包含该票证的身份验证标头重新发出 HTTP 请求。apache 服务器将在密钥表中查找其密钥、解密票证并授予访问权限。

发生“找不到密钥表条目”错误是因为 apache 在密钥表中找不到自己。如果名称解析/领域设置不正确,也可能会发生这种情况。

您应该能够在客户端、tcp 或 udp 端口​​ 88 上使用wireshark 查看所有 kerberos 请求 AP-REQ/AP-REP/TGS-REQ/TGS-REP。