[英]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.