2014-01-17 3 views
0

필자는 POP3을 사용하여 Gmail 계정에서 메일을 가져 오는 Perl 스크립트를 작성했습니다. Gmail이 POP3를 사용할 때 SSL 또는 TLS 연결을 요구하기 시작한 지 얼마되지 않아 스크립트가 손상되었습니다.펄에서 TLS가있는 POP3 - 시작하는 데 도움이 되나요?

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 = '[email protected]'; 
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: $!"; 

내 문제 : 다음

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Net::SSLGlue::POP3; 
use Mozilla::CA; 

my $host = 'pop.aol.com'; 
my $login = '[email protected]'; 
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"; 

는 (일부 세부 사항은 보안상의 이유로 변경) 내 정확한 코드의 일부입니다 :

나는이 샘플 코드를 포함 마이크 B의 블로그에 this interesting post 발견 그게 ...

$pop->starttls(
    SSL_verify_mode => 1, 
    SSL_ca_file => Mozilla::CA::SSL_ca_file() 
) || die "Can't perform starttls: $!"; 

... 나는 이유를 말할 수 없다. 어떤 제안?

UPDATE는 ... 당신 스테 감사드립니다.

$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.** 

이인가 기본적으로 말을 내가 디버그 => 1, 출력 $ IO :: 소켓 :: SSL :: SSL_ERROR 추가하여 내 코드를 업데이 트했습니다 , "Mozilla :: CA 인증서가 작동하지 않습니다."

답변

1

여러 가지 이유로 실패 할 수 있으며 Net :: POP3-> new 내에 Debug => 1을 추가하면 도움이됩니다. 다음 이유를 생각해 볼 수 있습니다.

  • 서버는 STLS 명령을 지원하지 않습니다. 이 경우에는 디버그 플래그로 실행할 때 오류 메시지가 나타나고 $ pop-> 메시지를 인쇄 할 수도 있습니다.
  • 서버가 STLS를 지원하지만 SSL 핸드 셰이크가 실패합니다. 이 경우 $ IO :: Socket :: SSL :: SSL_ERROR 변수에서 자세한 정보를 찾을 수 있습니다. 핸드 셰이크가 실패 할 수있는 일반적인 예
    • 인증서의 CA를 알 수 없습니다 (예 : Mozilla :: CA에서 제공하는 CA 저장소에 없음). 일반적으로 사적인 사람이나 회사 또는 대학의 서버를 사용하는 경우입니다. 공용 CA를 사용하여 인증서에 서명하거나 자체 서명 된 인증서를 사용하지 않는 경우가 종종 있습니다.
    • 공유 암호를 찾을 수 없습니다. MD5를하는 것을 좋아하는 구형 서버의 경우 일 수 있습니다. 최신 버전의 IO :: Socket :: SSL 또는 OpenSSL은 기본적으로 이러한 안전하지 않은 암호를 비활성화합니다.

이 디버그의 출력을 게시하시기 바랍니다 어쩌면 설정 $ IO :: 소켓 :: SSL :: DEBUG = 10도 도움이되지 않는 경우.

Steffen (인터넷 :: SSLGlue :: POP3, IO :: Socket :: SSL의 현재 개발자)

관련 문제