在Perl中使用TLS的POP3-帮助starttls工作?
我编写了一个Perl脚本,它使用POP3从Gmail帐户检索邮件。不久前,这个脚本被破坏了,我怀疑这是因为Gmail在使用POP3时开始需要SSL或TLS连接 我在Mike B的博客上发现,其中包括以下示例代码:在Perl中使用TLS的POP3-帮助starttls工作?,perl,ssl,pop3,starttls,Perl,Ssl,Pop3,Starttls,我编写了一个Perl脚本,它使用POP3从Gmail帐户检索邮件。不久前,这个脚本被破坏了,我怀疑这是因为Gmail在使用POP3时开始需要SSL或TLS连接 我在Mike B的博客上发现,其中包括以下示例代码: #!/usr/bin/env perl use strict; use warnings; use Net::SSLGlue::POP3; use Mozilla::CA; my $host = 'pop.aol.com'; my $login = 'myusername@ao
#!/usr/bin/env perl
use strict;
use warnings;
use Net::SSLGlue::POP3;
use Mozilla::CA;
my $host = 'pop.aol.com';
my $login = 'myusername@aol.com';
my $pass = '4Radfsai8fsfd9sdf9sdf';
my $pop3 = Net::POP3->new( $host) || die "Can't connect to $host: $!";
$pop3->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file(),
) || die "Can't perform starttls: $!";
my $messages = $pop3->login( $login, $pass )
|| die "Failed to authenticate login $login on $host: $!";
print "There are $messages messages on $host for $login.\n";
以下是我的部分确切代码(出于安全原因更改了一些细节):
我的问题是
$pop->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file()
) || die "Can't perform starttls: $!";
。。。失败了,但我不知道为什么。有什么建议吗
更新…
谢谢你,斯蒂芬。我通过添加Debug=>1并输出$IO::Socket::SSL::SSL\U错误更新了代码:
$pop = Net::POP3->new($mail_server, Debug => 1)
|| die("Could not log on to server.");
print(" - starttls using " . Mozilla::CA::SSL_ca_file() . "\n") if ($verbose);
$pop->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file()
) || die "Can't perform starttls: $!\n" . $IO::Socket::SSL::SSL_ERROR;
现在的错误消息是:
Net::POP3>>> Net::POP3(2.29)
Net::POP3>>> Net::Cmd(2.29)
Net::POP3>>> Exporter(5.63)
Net::POP3>>> IO::Socket::INET(1.31)
Net::POP3>>> IO::Socket(1.31)
Net::POP3>>> IO::Handle(1.28)
Net::POP3=GLOB(0xb41980)<<< +OK Dovecot ready.
- starttls using /usr/local/share/perl/5.10.1/Mozilla/CA/cacert.pem
Net::POP3=GLOB(0xb41980)>>> STLS
Net::POP3=GLOB(0xb41980)<<< +OK Begin TLS negotiation now.
Can't perform starttls:
**SSL connect attempt failed with unknown error error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate
verify failed at (my script) line 26.**
Net::POP3>>>Net::POP3(2.29)
Net::POP3>>>Net::Cmd(2.29)
Net::POP3>>>导出器(5.63)
Net::POP3>>>IO::Socket::INET(1.31)
Net::POP3>>>IO::Socket(1.31)
Net::POP3>>>IO::Handle(1.28)
Net::POP3=GLOB(0xb41980)>STL
Net::POP3=GLOB(0xb41980)可能有几个原因导致它失败,如果您在Net::POP3->new中添加Debug=>1,它会有所帮助。
我可以想到以下原因:
- 服务器不支持STLS命令。在这种情况下,当使用Debug标志运行时,您将看到一条错误消息,您还可以打印$pop->message
- 服务器支持STL,但SSL握手失败。在本例中,您将在$IO::Socket::SSL::SSL\U错误变量中找到更多信息。握手可能失败的典型例子
- 证书的CA未知(例如,不在Mozilla::CA提供的CA存储中)。对于私人服务器、公司或大学内部的服务器来说,这是典型的情况。他们通常不使用公共CA对证书进行签名,甚至不使用自签名证书
- 找不到共享密码。旧服务器可能就是这种情况,它们喜欢使用MD5。最新版本的IO::Socket::SSL或OpenSSL默认禁用这些不安全的密码
如果这没有帮助,请发布Debug的输出,也可以设置$IO::Socket::SSL::Debug=10
Steffen(Net::SSLGlue::POP3的作者,IO::Socket::SSL的当前开发人员)
Net::POP3>>> Net::POP3(2.29)
Net::POP3>>> Net::Cmd(2.29)
Net::POP3>>> Exporter(5.63)
Net::POP3>>> IO::Socket::INET(1.31)
Net::POP3>>> IO::Socket(1.31)
Net::POP3>>> IO::Handle(1.28)
Net::POP3=GLOB(0xb41980)<<< +OK Dovecot ready.
- starttls using /usr/local/share/perl/5.10.1/Mozilla/CA/cacert.pem
Net::POP3=GLOB(0xb41980)>>> STLS
Net::POP3=GLOB(0xb41980)<<< +OK Begin TLS negotiation now.
Can't perform starttls:
**SSL connect attempt failed with unknown error error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate
verify failed at (my script) line 26.**