Net :: LDAPS在SSL连接期间抛出未知错误
我试图使用Net :: LDAPS模块连接到LDAP服务器。我将正确的用户名,密码和capath传递给它。同一版本中的所有模块的相同代码适用于其他机器之一。但在这台特定的机器上,我看到了这个错误。Net :: LDAPS在SSL连接期间抛出未知错误
我一起工作的示例代码:
my $ad_host = 'XYZ';
my $ad_port = 636;
my $ad_user = 'ABC';
my $ad_pass = '****';
my $ca_path = '<path to ca cert>';
my $ldap = Net::LDAPS->new(
$ad_host,
port => $ad_port,
verify => 'require',
capath => $ca_path
);
难道是LDAPS模块中的一个已知的bug?或者我错过了一些明显的东西。
的调试日志:模块
DEBUG: .../IO/Socket/SSL.pm:179: set domain to 2
DEBUG: .../IO/Socket/SSL.pm:1427: new ctx 21295632
DEBUG: .../IO/Socket/SSL.pm:309: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:311: socket connected
DEBUG: .../IO/Socket/SSL.pm:324: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:354: set socket to non-blocking to enforce timeout=120
DEBUG: .../IO/Socket/SSL.pm:367: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:377: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:387: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:407: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:367: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:377: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:387: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:407: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:367: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:1175: SSL connect attempt failed with unknown error..error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
DEBUG: .../IO/Socket/SSL.pm:373: fatal SSL error: SSL connect attempt failed with unknown error..error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
DEBUG: .../IO/Socket/SSL.pm:1462: free ctx 21295632 open=21295632
DEBUG: .../IO/Socket/SSL.pm:1465: OK free ctx 21295632
DEBUG: .../IO/Socket/SSL.pm:1175: IO::Socket::INET6 configuration failederror:00000000:lib(0):func(0):reason(0)
版本我使用:
...:〜/ test_perl $ perlmodver的Net :: LDAPS 0.05
...: 〜/ test_perl $ perlmodver Net :: LDAP 0.39
...:〜/ test_perl $ perlmodver IO :: Socket :: SSL 1.18
此问题已解决。
有2种方法来解决这个问题:
绕过验证(不推荐)
如果您使用的是“验证”属性,像在我的代码,你必须要发表评论出来。它将绕过证书验证。
添加的软链接证书
也许这是特定于值得信赖的行为,因为明晰它是工作的罚款。因此,您需要创建一个到所有pem文件的软链接并将其放置在CA Path中。您可以通过运行来执行此操作
ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0
当为受信任的CA使用目录时,这些散列对于清晰和可靠都是必需的。但是,即使散列算法(以及由此产生的文件名)在openssl版本中发生了变化,也可能是因为您已经使用相同的散列表来清晰可信。当使用文件而不是CA的目录时,您不受此问题的影响。 –
如果查看错误,可以看到证书验证失败。
SSL connect attempt failed with unknown error..error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
您可以纠正证书或通过传递
verify => 'none'
在阿里纳斯忽略证书验证,您还可以使用Net::LDAP如果传递ldaps://
作为前缀$ad_host
。
$ldaps = Net::LDAP->new('ldaps://myhost.example.com:10000',
verify => 'require',
capath => $ca_path);
哎呀只注意到你说
The same code with all the modules in the same version works on one of my other machines. But on this particular machine I see this error.
那么这看起来像一个配置问题。你可以使用ldapsearch连接到你的服务器吗?
您可以使用ldapsearch连接到您的服务器吗? –
您正在使用8年前版本的模块。目前有所有这些模块的版本。你尝试过这些吗? –
@ChankeyPathak我可以通过telnet连接到我的AD机器上的端口636。另外,相同的perl脚本在类似的机器上运行完美,所有模块都是相同的。 – user1726707