Net :: LDAPS在SSL连接期间抛出未知错误

时间:2016-09-28 11:45:42

标签: perl ssl ldap perl-module

我正在尝试使用Net :: LDAPS模块连接到LDAP服务器。我正在传递正确的用户名,密码和capath。与同一版本中的所有模块相同的代码可以在我的其他计算机上运行。但在这台特定的机器上,我看到了这个错误。

我正在使用的示例代码:

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模块中的已知错误吗?或者我错过了一些明显的东西。

调试日志:

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 个答案:

答案 0 :(得分:1)

如果您查看错误,可以看到证书验证失败。

  

SSL连接尝试失败,出现未知错误。错误:14090086:SSL   例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

您可以通过传递

来更正证书或忽略证书验证
verify => 'none'

在旁注中,如果您将ldaps://作为$ad_host的前缀传递,也可以使用Net::LDAP

$ldaps = Net::LDAP->new('ldaps://myhost.example.com:10000',
                        verify => 'require',
                        capath => $ca_path);

哎呀刚注意到你说

  

同一版本中所有模块的相同代码适用于其中一个   我的其他机器。但是在这台特定的机器上,我看到了这个错误。

然后这看起来像配置问题。您可以使用ldapsearch连接到服务器吗?

答案 1 :(得分:0)

此问题已解决。

有两种方法可以解决这个问题:

绕过验证(不推荐)

如果您使用&#34;验证&#34;像我的代码中的那个属性,你只需要评论它。它将绕过证书验证。

添加证书的软链接

也许这是一种特别值得信任的行为,因为在清醒方面它运作良好。因此,您需要创建指向所有pem文件的软链接并将其放在CA路径中。您可以通过运行

来完成此操作
ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0