2014-11-08 80 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的猴子补丁)。