Net :: SSLeay получает ": SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата" при доступе к pop.gmail.com, как это видели многие другие - PullRequest
1 голос
/ 02 апреля 2020

У меня есть скрипт perl, который загружает электронную почту с pop.gmail.com:995, используя пакет CPAN Mail :: Box :: POP3s. Исходный код для этого:

   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.

Обе системы работают Windows10 Pro (обновление с 2019 года) с Active Perl 5.16.3. В системе, которая работает, у меня есть: IO :: Socket :: SSL версия 1.84 Net :: SSLeay версия 1.52 Openssl версия 1.02 В системе, которая выходит из строя, у меня есть: IO :: Socket :: SSL версия 1.962 Net :: SSLeay, версия 1.55 Openssl, версия 1.1.1d. Глядя на все предыдущие упоминания об этом синдроме ошибок в Интернете, я попытался: - установить IO :: Socket :: SSL для установки $ can_client_sni в 0 - загрузить цепочку доверенных ЦС из https://curl.haxx.se/ca/cacert.pem и добавьте его в Net :: SSLeay с помощью вызова Net :: SSLeay :: X509_STORE_add_crl. Ни один из них не решит проблему. Единственная разница в Windows 10 двух систем состоит в том, что в работающей системе * 201 * 10 Pro была установлена ​​в 2018 году, а новая система была приобретена всего за 2 недели go. Я пробовал разные решения в течение 2 дней и наверняка мог бы воспользоваться помощью таких экспертов, как Штеффен Ульрих и другие. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Во-первых, обратите внимание, что используемое программное обеспечение частично устарело. Версии IO :: Socket :: SSL и Net :: SSleay имеют 7 лет, и за эти годы было сделано много улучшений. Интересно, что ваши версии OpenSSL кажутся намного более новыми, и вы также используете Windows 10, что предполагает странное сочетание недавнего и ужасно старого программного обеспечения.

Версия 1.84 IO :: Socket :: SSL, которая вы использовали на одной машине не проверяет сертификаты по умолчанию, поэтому он будет работать, даже если что-то не так с сертификатами. Версия 1.962, используемая на другом компьютере, вместо этого требует проверки сертификата по умолчанию. Это означает, что на обеих машинах может быть одна и та же проблема, связанная с сертификатами, но вы заметите это только на одном компьютере.

К сожалению, Mail::POP3Client (который не поддерживается с 7 лет) не имеет никакого способа установить какое хранилище доверия используется, но зависит от правильно настроенного хранилища доверия в системе. Только такая настройка обычно не относится к OpenSSL (используется Perl) на Windows. Более новые версии IO :: Socket :: SSL автоматически получат хранилище доверия Mozilla::CA, если оно установлено, но не старые версии, которые вы используете.

Я предлагаю вам отойти от этого старого программного стека. Используйте более новые версии IO :: Socket :: SSL и Net :: SSLeay, а также установите Mozilla :: CA в качестве хранилища доверенных сертификатов. Я рекомендую также использовать Net :: POP3 вместо Mail :: POP3Client, поскольку последний давно не поддерживается, а первый дает вам также больший контроль над проверкой сертификатов. Я не уверен в том, что Active Perl вы используете, но бесплатная Strawberry Perl обычно поставляется с довольно свежим программным стеком.

0 голосов
/ 02 апреля 2020

Вы можете использовать любой из следующих

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...