2015-10-18 44 views
0

嘗試使用Email::Sender::Transport::SMTPS發送電子郵件。我的交通是:信任郵件中的自簽名證書::發件人::傳輸:: SMTPS in perl

my $transport = Email::Sender::Transport::SMTPS->new({ 
      host => $smtpserver, 
      ssl => 'starttls', 
      sasl_username => $smtpuser, 
      sasl_password => $smtppassword, 
      debug => 1, 
    }); 

當試圖發送電子郵件,調試說:

Net::SMTPS=GLOB(0x7f893b2b00f0)<<< 250-SIZE 52428800 
Net::SMTPS=GLOB(0x7f893b2b00f0)<<< 250-8BITMIME 
Net::SMTPS=GLOB(0x7f893b2b00f0)<<< 250-PIPELINING 
Net::SMTPS=GLOB(0x7f893b2b00f0)<<< 250-STARTTLS 
Net::SMTPS=GLOB(0x7f893b2b00f0)<<< 250 HELP 
Net::SMTPS=GLOB(0x7f893b2b00f0)>>> STARTTLS 
Net::SMTPS=GLOB(0x7f893b2b00f0)<<< 220 TLS go ahead 
DEBUG: .../IO/Socket/SSL.pm:735: local error: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed 
DEBUG: .../IO/Socket/SSL.pm:738: fatal SSL error: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed 
unable to establish SMTP connection 

可能是因爲使用self-signed證書的服務器。 (在Thunderbird中使用相同的設置時,需要添加「信任此證書」設置。)

問題是:如何爲Email::Sender::Transport::SMTPS添加「信任此證書」 - 從而允許發送電子郵件。

回答

1

有沒有直接的方式給電子郵件::發件人::運輸:: SMTPS SSL特定的參數。但是,由於最終使用了IO:Socket::SSL,因此您可以繞過這個限制。從手冊頁:

這是使用IO :: Socket :: SSL:時看到的典型錯誤列表。 ...

  • 使SSL設置無法由用戶訪問,以及壞的內置設置。

    某些模塊使用IO :: Socket :: SSL,但不要使SSL設置可供用戶使用。這通常與糟糕的內置設置或默認設置(如切換驗證關閉)相結合。因此,用戶需要通過使用set_args_filter_hack或類似方法來解決這些限制。

因此你可以做的是

IO::Socket::SSL::set_args_filter_hack(sub { 
    my ($is_server,$args) = @_; 
    $args->{SSL_fingerprint} = 'sha1$437104....' 
}); 

使用這個選項,你可以讓證書釘扎,只要它的指紋是否匹配給定的一個信任的證書。你可以得到指紋例如用:

openssl s_client -connect mail.example.org:25 -starttls smtp |\ 
openssl x509 -fingerprint -noout 

替代方法是使用該證書作爲與SSL_ca_file選項信賴。您也可以將SSL_verify_mode設置爲0(SSL_VERFY_NONE),但由於此功能會禁用任何驗證,因此應僅將其用於測試。

請注意,set_args_filter_hack是全局的,它會影響程序中的所有IO :: Socket :: SSL對象。因此,根據程序的不同,您應該只在使用Email :: Sender :: Transport :: SMTPS建立連接之前直接設置它,然後立即重置。

有關這些選項的更多信息,請閱讀documentation of IO::Socket::SSL

+0

'set_args_filter_hack'方法'正常工作'。:)易於實現並且只允許特定的指紋。謝謝。 – jm666

0

你可以控制的新選項的SSL使用()構造函數方法

"SSL_verify_mode"=>'SSL_VERIFY_NONE' 

電子郵件/發件人/運輸/ SMTPS.pm

# compatible 
    my $ssl = $self->ssl; 
    $ssl = 'ssl' if $self->ssl and $self->ssl ne 'starttls'; 

    return (
    $self->host, 
    Port => $self->port, 
    Timeout => $self->timeout, 
    defined $ssl    ? (doSSL  => $ssl)    :(), 
    defined $self->helo  ? (Hello  => $self->helo)  :(), 
    defined $self->localaddr ? (LocalAddr => $self->localaddr) :(), 
    defined $self->localport ? (LocalPort => $self->localport) :(), 
    defined $self->debug  ? (Debug  => $self->debug) :(), 
    "SSL_verify_mode"=>'SSL_VERIFY_NONE',#ADDED LINE 
); 

編輯:這是非常糟糕的,因爲根據評論你信任一切。相反,如果在Linux/* nix

cat tobetrusted.crt >> /etc/ssl/cert.pem 
+0

您能否在問題的上下文中添加更多信息?如何通過Email :: Sender :: Transport :: SMTPS來使用它? (看起來像'Email :: Sender :: Transport :: SMTPS'不接受'SSL_verify_mod =>'SSL_VERIFY_NONE''。 – jm666

+0

這不會信任證書,但會禁用任何驗證並因此隱含信任任何東西。 –

+0

您可以將證書複製到客戶端的可信存儲區 – user993553

相關問題