首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Perl中使用TLS的POP3 -帮助使starttls工作吗?

在Perl中使用TLS的POP3 -帮助使starttls工作吗?
EN

Stack Overflow用户
提问于 2014-01-17 18:26:14
回答 1查看 1.6K关注 0票数 0

我编写了一个Perl脚本,它使用POP3从Gmail帐户检索邮件。不久前,脚本崩溃了,我怀疑这是因为Gmail在使用POP3时开始需要SSL或TLS连接。

我在Mike的博客上找到了这个有趣的帖子,其中包括以下示例代码:

代码语言:javascript
运行
复制
#!/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";

下面是我的一部分代码(出于安全原因更改了一些细节):

代码语言:javascript
运行
复制
use YAML;
use Net::SSLGlue::POP3;
use Mozilla::CA;
use Email::Find;
use Data::Dumper;
use LWP::Simple;

my $email_finder = Email::Find->new(\&process_email);
my $verbose = 1;
my $email_account = 'my.email@mydomain.net';
my $email_password = 'somepassword';
my $mail_server = "mail.mydomain.net";

print("\nStarted\n") if ($verbose);

$pop = Net::POP3->new($mail_server) || 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: $!";

我的问题是..。

代码语言:javascript
运行
复制
$pop->starttls(
  SSL_verify_mode => 1,
  SSL_ca_file => Mozilla::CA::SSL_ca_file()
) || die "Can't perform starttls: $!";

..。失败了但我说不出原因。有什么建议吗?

更新.

谢谢你斯特芬。通过添加调试=> 1并输出$IO::Socket::SSL::SSL_ERROR,我更新了代码:

代码语言:javascript
运行
复制
$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;

现在的错误消息是:

代码语言:javascript
运行
复制
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.**

这基本上是说,“Mozilla::CA证书不适合您”吗?

EN

Stack Overflow用户

发布于 2014-01-17 19:22:07

它可能失败的原因有几个,如果您在Net::POP3 3-> => 1中添加Debug POP3 1,它会有所帮助。我可以想出以下的理由:

  • 服务器不支持STLS命令。在这种情况下,您将看到使用Debug标志运行时的错误消息,也可以打印$pop->消息。
  • 服务器支持STLS,但SSL握手失败。在本例中,您将在$IO::Socket::SSL::SSL_ERROR变量中找到更多信息。握手可能失败的典型示例
    • 证书的CA是未知的(例如,不在Mozilla::CA提供的CA存储中)。私人服务器或公司或大学内部的服务器就是这种情况。他们通常不使用公共CA来签署证书,甚至不使用自签名证书。
    • 找不到共享密码。较旧的服务器也是如此,它们喜欢执行MD5。最新版本的IO::Socket::SSL或OpenSSL默认禁用这些不安全密码。

如果这没有帮助,请发布来自调试的输出,并可能设置$IO::Socket::SSL::DEBUG=10。

Steffen ( Net::SSLGlue::POP3 3的作者,IO::Socket::SSL的当前开发人员)

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21193149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档