【发布时间】:2012-05-03 09:45:27
【问题描述】:
我正在编写一个 Web 前端来管理我们公司的 OpenLDAP 服务器。我正在使用 Perl、Apache2、OpenLDAP、Cyrus SASL。
问题是,在使用 Web 界面时,我无法以 Kerberos 验证用户身份向 OpenLDAP 进行身份验证,因为我的 Kerberos 凭据没有被转发,并且 Apache 错误日志显示:
Credentials cache file '/tmp/krb5cc_33' not found
其中“33”是 Apache 的 uidNumber。这是有道理的,但不能解决问题。具有讽刺意味的是,这一切都可以在领域之外进行,因为 mod_auth_kerb 会询问用户名和密码,进行身份验证,缓存票证,然后一切正常。
我正在使用 mod_auth_kerb 对 Apache2 进行身份验证,它工作正常:未提示密码,向经过身份验证的用户显示受保护的页面(否则被拒绝)。相关配置片段:
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
AuthType Kerberos
AuthName "Kerberos Login"
KrbAuthRealms EXAMPLE.COM
Krb5Keytab /etc/apache2/HTTP.keytab
KrbServiceName HTTP
KrbSaveCredentials on
require valid-user
</Directory>
Kerberos/GSSAPI/SASL 身份验证也可以正常工作,因此从命令行运行时,此代码可以正常运行:
1 #!perl
2 use strict;
3 use warnings;
4 use Net::LDAP;
5 use Authen::SASL;
6
7 my $l = Net::LDAP->new( 'ldap.example.com', onerror=>'die', );
8 my $sasl = Authen::SASL->new(mechanism=>'GSSAPI');
9 $l->bind( sasl=>$sasl );
10
11 print "OK\n";
那么,可能的解决方案是什么?
【问题讨论】:
-
你遇到双跳了吗?你检查过 perl 脚本中绑定调用的返回值吗?它可能有错误。
标签: perl apache kerberos openldap sasl