2010-07-09 57 views
1

我想在Perl中使用Net :: LDAP来对我的Server 2008 Active Directory执行LDAPS身份验证,而且我很难让服务器验证工作。它在start_tls,我使用verify=> 'none',但它不是很好。在Perl-LDAP中使用StartTLS

当我使用verify => 'require'(这是优选的),我得到这个错误:

SSL connect attempt failed with unknown error error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm at ./ldap.pl line 23, line 522.

当我从使用OpenSSL的s_client.First它的伟大工程的命令行测试,所以我不认为这是一个OpenSSL的问题。我很喜欢Perl,所以我不确定还有什么要调试。

下面是相关的代码片段:

#!/usr/bin/perl 
use Net::LDAP; 

$ldap = Net::LDAP->new('ho.mydomain.com', 
         ) or die "LDAP error"; 
$mesg = $ldap->start_tls(
    sslversion => 'tlsv1', 
    verify => 'require', 
    capath => '/etc/ssl/certs/', 
    ); 
die $mesg->error if $mesg->is_error; 

从OpenSSL的的s_client.First输出:

 

New, TLSv1/SSLv3, Cipher is AES128-SHA 
Server public key is 2048 bit 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : AES128-SHA 
    Session-ID: [removed] 
    Session-ID-ctx: 
    Master-Key: [removed]  
    Key-Arg : None 
    Start Time: 1278707544 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 

任何帮助将不胜感激。

感谢

回答

0

你确定你的s_client.First正常工作验证整个证书链(通过-verify选项)时?

“未知消息摘要算法”意味着链中的某些加密元素不支持摘要散列某些证书在受信任根的路径中。

它可能是中间或根证书使用有问题的散列算法(如果您有一个旧的openssl,可能是sha256,或者如果您有新的openssl,则可能是旧的)。

确保你有一个最近的openssl库。有关这种情况的一个示例,请参阅http://bugs.gentoo.org/294615

+0

有趣的是,感谢您的输入!我认为验证正在整个链上工作,s_client不会给出任何错误。这里是输出的顶部: 连接(00000003) depth = 1/DC = com/DC = mydomain/DC = ho/CN = DC01 验证返回:1 depth = 0 /CN=dc03.ho。 mydomain.com 验证返回:1支 --- 证书链 0 S:/CN=dc03.ho.mydomain.com I:/ DC = COM/DC = MYDOMAIN/DC = HO/CN = DC01 - - 我的openssl版本是0.9.8h。 再次感谢, – Tracert 2010-07-09 21:20:22

+0

那么,那是一个死胡同。 再次尝试:您是否具有安装Perl-LDAP的所有先决条件?具体来说,如果服务器提供DIGEST-MD5 SASL认证,则需要安装Digest :: MD5。 – Borealid 2010-07-09 21:43:38

+0

另外,请确保使用LDAP v3。真的没有理由不想这样做。 'Net :: LDAP-> new('ho.mydomain.com',version => 3);' – Borealid 2010-07-09 21:45:18