Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Net::LDAPS在SSL连接期间引发未知错误_Perl_Ssl_Ldap_Perl Module - Fatal编程技术网

Perl Net::LDAPS在SSL连接期间引发未知错误

Perl Net::LDAPS在SSL连接期间引发未知错误,perl,ssl,ldap,perl-module,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::

我正在尝试使用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
);
我正在使用的模块版本:

…:~/test_perl$perlmodver Net::LDAPS 0.05

…:~/test_perl$perlmodver Net::LDAP 0.39

…:~/test_perl$perlmodver IO::Socket::SSL
1.18如果查看错误,可以看到证书验证失败

SSL连接尝试失败,出现未知错误..错误:14090086:SSL 例程:SSL3\u获取\u服务器\u证书:证书验证失败

您可以通过传递来更正证书或忽略证书验证

verify => 'none'
另一方面,如果您将
ldaps://
作为
$ad\u host
的前缀,也可以使用if

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

哎呀,我刚注意到你说

同一版本中所有模块的同一代码在其中一个模块上工作 我的其他机器。但是在这台机器上我看到了这个错误


那么这看起来像是一个配置问题。是否可以使用连接到服务器?

此问题已解决

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

绕过验证(不推荐)

如果您使用的是“verify”属性,就像我的代码中的属性一样,您只需将其注释掉即可。它将绕过证书验证

向证书添加软链接

也许这是trusty特有的行为,因为在lucid上它工作得很好。因此,您需要创建一个指向所有pem文件的软链接,并将其放置在CA路径中。你可以通过跑步来做到这一点

ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0
ln-s cacert.pem`openssl x509-hash-noout
您可以使用ldapsearch连接到您的服务器吗?您使用的是已有8年历史的模块版本。所有这些模块都有当前版本。你试过这些吗?@ChankeyPathak我可以用telnet连接到我的广告机上的636端口。同样,相同的perl脚本在一台类似的机器上完美地运行,所有模块都是相同的。@SteffenUllrich我可以在一台类似的机器上用相同的脚本成功地查询广告。这两台机器之间的唯一区别是脚本运行的机器在lucid上运行,而这台机器在trusty上运行。这和这个错误有什么关系吗?@user1726707:如果模块版本相同,那么显然您正在使用自己的Perl(或者至少是一些模块,这些模块在trusty和lucid之前的几年中)。但是,您可能依赖于系统附带的底层Net::SSLeay和openssl库,并解释了它们之间的差异。在为受信任CA使用目录时,lucid和trusty都需要这些哈希。但是,您可能对lucid和trusty使用了相同的哈希,即使哈希算法(以及由此产生的文件名)在openssl版本中已更改。当使用文件而不是CA目录时,您不会受到此问题的影响。
ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0