2016-09-28 86 views
1

我試圖使用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的Ne​​t :: LDAPS 0.05

...: 〜/ test_perl $ perlmodver Net :: LDAP 0.39

...:〜/ test_perl $ perlmodver IO :: Socket :: SSL 1.18

+0

您可以使用ldapsearch連接到您的服務器嗎? –

+0

您正在使用8年前版本的模塊。目前有所有這些模塊的版本。你嘗試過這些嗎? –

+0

@ChankeyPathak我可以通過telnet連接到我的AD機器上的端口636。另外,相同的perl腳本在類似的機器上運行完美,所有模塊都是相同的。 – user1726707

回答

0

此問題已解決。

有2種方法來解決這個問題:

繞過驗證(不推薦)

如果您使用的是「驗證」屬性,像在我的代碼,你必須要發表評論出來。它將繞過證書驗證。

添加的軟鏈接證書

也許這是特定於值得信賴的行爲,因爲明晰它是工作的罰款。因此,您需要創建一個到所有pem文件的軟鏈接並將其放置在CA Path中。您可以通過運行來執行此操作

ln -s cacert.pem `openssl x509 -hash -noout < cacert.pem`.0 
+1

當爲受信任的CA使用目錄時,這些散列對於清晰和可靠都是必需的。但是,即使散列算法(以及由此產生的文件名)在openssl版本中發生了變化,也可能是因爲您已經使用相同的散列表來清晰可信。當使用文件而不是CA的目錄時,您不受此問題的影響。 –

1

如果查看錯誤,可以看到證書驗證失敗。

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連接到你的服務器嗎?