【问题标题】:silent failure when creating new Net::SMTP::SSL object创建新的 Net::SMTP::SSL 对象时静默失败
【发布时间】:2015-01-05 12:17:45
【问题描述】:

[在 OS X 10.9.5 上运行 perl 5.16.2]

我有一个小秘密圣诞老人 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 名称不匹配,但显然与去年相比发生了一些变化,导致它无法正常工作。)

【问题讨论】:

  • 检查 $!$IO::Socket::SSL::SSL_ERROR 以获取失败原因的详细信息。
  • @SteffenUllrich $! 为空,$IO::Socket...IO::Socket::INET6 configuration failed
  • @SteffenUllrich 我刚刚在脚本开头尝试了use IO::Socket::SSL 'inet4';,现在错误是IO::Socket::INET configuration failed
  • 我是否有可能安装了“错误”版本的IO::Socket::SSLNet::SMTP::SSL?确认这一点的最佳方法是什么?
  • 您使用哪些版本?您可以检查版本打印class->VERSION,例如perl -MIO::Socket::SSL -e 'die IO::Socket::SSL->VERSION'。此外,尝试使用 SSL 调试运行您的代码,即perl -MIO::Socket::SSL=debug4 app.pl 并发布结果。如果您可以发布真实的目标主机名,我可以进行更多调试。

标签: perl ssl smtp


【解决方案1】:

IO::Socket::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 设置来定义预期的主机名。

顺便说一句,如果安装了 IO::Socket::SSL,大约一个月后,libnet(它提供了 CORE 模块 Net::SMTPNet::FTP、...)支持 SSL/TLS。这包括对直接 SSL 和 STARTTLS 的支持,因此您不需要任何特殊情况模块,例如 Net::SMTP::SSL(仅直接 SSL)、Net::SMTP::TLS(仅 STARTTLS)或 Net::SSLGlue::SMTP(猴子补丁 Net::SMTP 以支持两者) 不再。

【讨论】:

    【解决方案2】:

    我尝试了一些东西。我为 Windows 安装了 Perl 5.18.2 (x86) 并通过了空的 SMTP-SSL 连接器,但在解决“554 5.7.1 客户端主机被拒绝”错误时遇到了问题。我最终回到了 Mac,暂时更改了我的密码并使用不安全的Net::SMTP 发送电子邮件,然后再次更改密码。显然是一些错误,但我只需要解决这个问题。

    【讨论】:

      【解决方案3】:

      您是否检查过升级是否会受到这些错误之一的影响(也许首先):

      Cpan Bug reports

      在我看来适合:新电脑 -> 可能是更新版本 -> SMTP 2.35+ 的错误(列表中的第一个)。

      也许您应该简单地使用 Net::SMTP 本身?

      【讨论】:

      • 自 libnet-3.0 以来,仅 Net::SMTP 支持 SSL/TLS,它大约有一个月的历史,它还需要一个相当新版本的 IO::Socket::SSL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多