[英]Net::SSLeay gets ":SSL3_GET_SERVER_CERTIFICATE:certificate verify failed" failure when accessing pop.gmail.com, as seen by so many others
我有一个 perl 脚本,它使用 CPAN Mail::Box::POP3s 包从 pop.gmail.com:995 下载电子邮件。 执行此操作的源代码是:
my $pop = Mail::Box::POP3s->new(username => $recordsUser,
password => $recordsPassword,
server_name => $pop3Server);
my($nrOfMsgs) = $pop->nrMessages;
print "Received $nrOfMsgs\n";
在一个 Windows 10 系统上,这可以完美运行。 但在另一个失败,签名:
DEBUG: .../IO/Socket/SSL.pm:1890: new ctx 76411024
DEBUG: .../IO/Socket/SSL.pm:393: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:395: socket connected
DEBUG: .../IO/Socket/SSL.pm:413: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:443: using SNI with hostname pop.gmail.com
DEBUG: .../IO/Socket/SSL.pm:479: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:1359: SSL connect attempt failed with unknown error
DEBUG: .../IO/Socket/SSL.pm:485: 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:1924: free ctx 76411024 open=76411024
DEBUG: .../IO/Socket/SSL.pm:1932: OK free ctx 76411024
ERROR: Cannot connect to pop.gmail.com:995 for POP3: Bad file descriptor
ERROR: Cannot create POP3 client for inbox.
Can't call method "nrMessages" on an undefined value at ./emailToNotes.pl line 110.
这两个系统都运行带有 Active Perl 5.16.3 的 Windows10 Pro(更新至 2019 年)。 在运行的系统上,我有: IO::Socket::SSL version 1.84 Net::SSLeay version 1.52 Openssl version 1.02 在出现故障的系统上,我有: IO::Socket::SSL version 1.962 Net::SSLeay version 1.55 Openssl 版本 1.1.1d 查看之前在网络上提到的所有此错误综合症,我尝试: - 修补 IO::Socket::SSL 以将 $can_client_sni 设置为 0 - 从https://curl下载受信任的 CA 链.haxx.se/ca/cacert.pem ,并通过调用 Net::SSLeay::X509_STORE_add_crl 将其添加到 Net::SSLeay 这些都不能解决问题。 两个系统的Windows 10唯一不同的是,运行的系统在2018年安装了Windows 10 Pro,而新系统是在2周前才购买的。 我已经尝试了 2 天的不同解决方案,并且肯定可以使用 Steffen Ullrich 等专家的帮助。 提前致谢。
首先,请注意您正在使用的软件部分已经很旧了。 IO::Socket::SSL 和 Net::SSleay 的版本已有 7 年的历史,并且在这些年中进行了很多改进。 有趣的是,尽管您的 OpenSSL 版本似乎更新了很多,而且您还在运行 Windows 10,但这表明最近的软件和非常旧的软件混合在一起。
您在一台机器上使用的 IO::Socket::SSL 版本 1.84 默认不验证证书,因此即使证书出现问题,它也能正常工作。 另一台机器上使用的 1.962 版本坚持默认验证证书。 这意味着两台机器实际上可能有与证书相关的相同问题,但您只会在一台机器上注意到它。
不幸的是Mail::POP3Client
(自 7 年来不受支持)无法设置使用哪个信任库,而是依赖于系统上正确设置的信任库。 Windows 上的 OpenSSL(由 Perl 使用)通常不是这样的设置。 较新版本的 IO::Socket::SSL 将自动选择信任存储Mozilla::CA
如果它已安装但不是您正在使用的旧版本。
我建议你远离这个旧的软件堆栈。 使用较新版本的 IO::Socket::SSL 和 Net::SSLeay,并将 Mozilla::CA 安装为信任存储。 我建议还使用 Net::POP3 而不是 Mail::POP3Client,因为后者早已不受支持,而第一个还可以让您更好地控制证书验证。 我不确定您正在使用的 ActivePerl,但免费的 Strawberry Perl 通常带有相当新的软件堆栈。
您可以使用以下任一
use strict;
use warnings;
use feature 'say';
use Mail::POP3Client;
my $mail;
$mail->{user} = 'your_account@gmail.com';
$mail->{passwd} = 'your_password';
$mail->{host} = 'pop.gmail.com';
my $pop = new Mail::POP3Client(
USER => $mail->{user},
PASSWORD => $mail->{passwd},
HOST => $mail->{host},
USESSL => 'true',
DEBUG => 0
);
$pop->Connect() or die $pop->Message();
say 'Messages: ' . $pop->Count();
$pop->Close();
或者
use strict;
use warnings;
use feature 'say';
use Mail::POP3Client;
use IO::Socket::SSL;
$IO::Socket::SSL::DEBUG = 0; # Level 0..3
my($mail,$ssl);
$mail->{user} = 'your_account@gmail.com';
$mail->{passwd} = 'your_password';
$ssl->{host} = 'pop.gmail.com';
$ssl->{port} = 995;
$ssl->{proto} = 'tcp';
my $socket = IO::Socket::SSL->new(
PeerAddr => $ssl->{host},
PeerPort => $ssl->{port},
Proto => $ssl->{proto}
) || die "No socket!";
my $pop = Mail::POP3Client->new();
$pop->User($mail->{user});
$pop->Pass($mail->{passwd});
$pop->Socket($socket);
$pop->Connect() or die $pop->Message();
say 'Messages: ' . $pop->Count();
$pop->Close();
使用 Net::POP3 模块的代码
use strict;
use warnings;
use feature 'say';
use Net::POP3;
use Data::Dumper;
my $mail;
$mail->{host} = 'pop.gmail.com';
$mail->{userid} = 'your_account@gmail.com';
$mail->{passwd} = 'your_password';
my $pop = Net::POP3->new($mail->{host}, SSL => 1, Timeout => 60);
if ($pop->login($mail->{userid}, $mail->{passwd}) > 0) {
my $msgnums = $pop->list; # hashref of msgnum => size
say 'Messages: ' . scalar keys %$msgnums;
}
$pop->quit;
使用以下模块进行测试
cpan -D Mail::POP3Client
Loading internal logger. Log::Log4perl recommended for better logging
CPAN: CPAN::SQLite loaded ok (v0.217)
Database was generated on Thu, 02 Apr 2020 02:48:07 GMT
Mail::POP3Client
-------------------------------------------------------------------------
CPAN: Module::CoreList loaded ok (v5.20200314)
(no description)
S/SD/SDOWD/Mail-POP3Client-2.19.tar.gz
C:\bin\Portable\strawberry-perl\perl\site\lib\Mail\POP3Client.pm
Installed: 2.19
CPAN: 2.19 up to date
Sean Dowd (SDOWD)
pop3client-USEMYCPANADDRESSFORHELP@dowds.net
cpan -D IO::Socket::SSL
Loading internal logger. Log::Log4perl recommended for better logging
CPAN: CPAN::SQLite loaded ok (v0.217)
Database was generated on Thu, 02 Apr 2020 02:48:07 GMT
IO::Socket::SSL
-------------------------------------------------------------------------
(no description)
S/SU/SULLR/IO-Socket-SSL-2.068.tar.gz
C:\bin\Portable\strawberry-perl\perl\vendor\lib\IO\Socket\SSL.pm
Installed: 2.067
CPAN: 2.068 Not up to date
Steffen Ullrich (SULLR)
Steffen_Ullrich@genua.de
cpan -D Net::POP3
Loading internal logger. Log::Log4perl recommended for better logging
CPAN: CPAN::SQLite loaded ok (v0.217)
Database was generated on Fri, 03 Apr 2020 03:27:32 GMT
Net::POP3
-------------------------------------------------------------------------
CPAN: Module::CoreList loaded ok (v5.20200314)
(no description)
S/SH/SHAY/libnet-3.11.tar.gz
C:\bin\Portable\strawberry-perl\perl\lib\Net\POP3.pm
Installed: 3.11
CPAN: 3.11 up to date
Steve Hay (SHAY)
shay@cpan.org
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.