我想在 Linux 上使用带有 mod_auth_kerb 的 Kerberos 和 Apache 2。
我将 .htaccess 添加到我的项目中,内容如下:
#SSLRequireSSL
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbAuthRealms DOMAIN.COM
Krb5KeyTab /etc/httpd/httpd.keytab
KrbLocalUserMapping On
require valid-user
当我尝试在 IE 或 Firefox 上测试我的单点登录时,我在 Apache 日志中收到以下错误:
[Thu Jan 19 21:03:27 2012] [error] [client 10.65.0.1] gss_accept_sec_context() failed: An unsupported mechanism was requested (, Unknown error)
我不知道它是什么以及我应该怎么做才能让它发挥作用。
我的目的是让 REMOTE_USER 填写 AD 用户名。但现在由于这个错误,我什么也做不了……
答案1
在一个简单的设置中,使用 mod_auth_gssapi 和 FreeIPA 作为 krb5 服务器并生成密钥表,我发现在命令旁边添加以下内容AuthType
可以解决问题。
BrowserMatch Windows gssapi-no-negotiate
根据 andsens 的回答,似乎确实在尝试使用 NTLM 的 Windows 客户端上发生了这种情况。GssapiAllowedMech krb5
并且GssapiBasicAuthMech krb5
协商没有成功,因此唯一的解决方案似乎是禁用协商。虽然我不能保证这是准确的,但它对我来说是有效的。
相应的文档是这里
答案2
我发现此错误的另一个原因:
Windows 尝试使用 NTLM 进行身份验证。实际上,这就是问题的根源。
我不明白重新创建密钥表有什么帮助,错误应该是“密钥表条目未找到”之类的。
当 Windows 无法从 KDC 获取票证时,它会尝试通过 NTLM 进行身份验证。
对我来说,原因是我的服务器不在同一个域内。域是ad.domain.com
,但我的服务器位于something.domain.com
。我相信您也可以以某种方式允许这种情况,但简单的解决方法是更改指向服务器的主机名(然后为该域创建一个新的密钥表)。
答案3
主体存在问题。我重新创建了 /etc/httpd/httpd.keytab 并正确添加了 HTTP 主体,一切正常!