簡體   English   中英

Net::SSLeay 在訪問 pop.gmail.com 時出現“:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed”失敗,正如許多其他人所見

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM