2014-11-08 124 views
1

[運行在OS的Perl 5.16.2 X 10.9.5]無聲故障

我有一個小祕密聖誕老人perl腳本我一年重溫一次,現在這次它決定給我一個麻煩。 (我有一個新的電腦一樣,所以確實存在着與去年不同的環境。)我打電話:

$smtp = Net::SMTP::SSL->new(Host => "mail.mydomain.org", Port => 465); 

,當它返回,$ SMTP包含Perl調試沒有價值('p $smtp'剛顯示一個空行)和隨後的訪問像$stmp->domain(和$smtp->auth())失敗,錯誤

Can't call method "domain" on an undefined value at ./secretsanta.pl line 67. 

缺少什麼我在這裏?感謝任何指針。

編輯:當我打開SSL調試(perl -MIO::Socket::SSL=debug4 secretsanta.pl)我得到:

DEBUG: .../IO/Socket/SSL.pm:1769: Invalid default certificate authority locations 
SSL error: 8606: 1 - error:2006D002:BIO routines:BIO_new_file:system lib 
SSL error: 8606: 2 - error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib 

DEBUG: .../IO/Socket/SSL.pm:1774: Invalid default certificate authority locations error:0200100D:system library:fopen:Permission denied 
DEBUG: .../IO/Socket/SSL.pm:529: socket not yet connected 
DEBUG: .../IO/Socket/SSL.pm:531: socket connected 
DEBUG: .../IO/Socket/SSL.pm:553: ssl handshake not started 
DEBUG: .../IO/Socket/SSL.pm:1769: SSL structure creation failed 

DEBUG: .../IO/Socket/SSL.pm:1774: SSL structure creation failed error:140BA0C3:SSL routines:SSL_new:null ssl ctx 
DEBUG: .../IO/Socket/SSL.pm:1758: IO::Socket::INET configuration failed 

(我用我的託管公司提供的SSL證書,不符合我的郵件服務器的DNS名稱,但很明顯的東西從去年開始改變導致此不工作)

+0

檢查'$!'和'$ IO :: Socket :: SSL :: SSL_ERROR'以獲取細節失敗的原因。 – 2014-11-08 22:29:33

+0

@SteffenUllrich'$!'是空的,'$ IO :: Socket ...'是'IO :: Socket :: INET6配置失敗' – Conrad 2014-11-08 22:48:01

+0

@SteffenUllrich我剛試過'使用IO :: Socket :: SSL'inet4' ;'在腳本開始,現在錯誤是'IO :: Socket :: INET配置失敗' – Conrad 2014-11-08 23:08:30

回答

0

你檢查是否通過升級,你被這些錯誤的一個(第一也許影響)。

Cpan Bug reports

似乎適合我:新電腦 - >也許更新版本 - > 與SMTP 2.35 +(列表中的第一個)的錯誤。

也許你應該簡單地使用Net :: SMTP本身?

+0

SSL/TLS只在Net :: SMTP中支持,因爲libnet-3.0大約有一個月的時間,它也需要相當近期的IO :: Socket :: SSL版本。 – 2014-11-08 22:32:22

0

我試了幾件事。我爲Windows安裝了Perl 5.18.2(x86),並通過了空的SMTP-SSL連接器,但在解決'554 5.7.1客戶端主機拒絕'錯誤時遇到問題。我結束了回到Mac,暫時更改我的密碼,並使用不安全的Net::SMTP發送電子郵件,然後再次更改密碼。顯然有一些錯誤,但我只是需要這樣做。

0

IO ::插座:: SSL:2.002

哪個是最新版本。如果每年只運行一次腳本,那麼在這段時間內會發生很大變化。

DEBUG: .../IO/Socket/SSL.pm:1769: Invalid default certificate authority locations 
SSL error: 8606: 1 - error:2006D002:BIO routines:BIO_new_file:system lib 
SSL error: 8606: 2 - error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib 

看起來像是發現了一個CA路徑,但有一些問題需要使用它。能否請你檢查它找到了什麼,那就是

perl -MIO::Socket::SSL -MData::Dumper -e 'warn Dumper({ IO::Socket::SSL::default_ca() })' 

如果返回一個SSL_ca_path設置與目錄值確保該目錄中的所有文件實際上是由程序可讀性。

(我用我的託管公司提供的SSL證書,不符合我的郵件服務器的DNS名字,但很明顯的東西從去年開始改變導致此不工作。)

這肯定會給問題,但只有第一個問題得到解決。去年的一個變化是默認實施某種主機名檢查,因爲使用IO::Socket::SSL的模塊經常忘記爲主機名設置適當的驗證模式(包括Net::SMTP::SSL)。

如果證書中的此主機名與您指定的目標不同,您需要明確使用SSL_verifycn_name設置來定義預期的主機名。

順便說一句,因爲大約一個月的libnet(其提供核心模塊Net::SMTPNet::FTP,...)具有用於SSL/TLS的支持,如果IO::Socket::SSL安裝。這包括對直接SSL和STARTTLS的支持,因此您不需要任何特殊情況下的模塊,如Net::SMTP::SSL(僅限於直接SSL),Net::SMTP::TLS(僅限STARTTLS)或Net::SSLGlue::SMTP(支持Net :: SMTP的猴子補丁)。