Perl
在 /usr/share/perl5/IO/Socket/SSL.pm 第 332 行指定的 SSL_version 無效
由於我將 PC 從 (k)ubuntu 12.04 升級到 12.10,因此在嘗試使用
sendemail
.安裝舊版本的 IO::Socket::SSL 不是一種選擇。我的印像是一切正常,消息只是一個警告。
我怎樣才能擺脫這個消息?
SSL.pm
我認為以下內容與問題有關(/usr/share/perl5/IO/Socket/SSL.pm)。
34 use constant DEFAULT_VERSION => 'SSLv23:!SSLv2';
…
251 my %default_args = ( 252 Proto => 'tcp', 253 SSL_server => $is_server, 254 SSL_use_cert => $is_server, 255 SSL_check_crl => 0, 256 SSL_version => DEFAULT_VERSION, 257 SSL_verify_mode => SSL_VERIFY_NONE, 258 SSL_verify_callback => undef, 259 SSL_verifycn_scheme => undef, # don't verify cn 260 SSL_verifycn_name => undef, # use from PeerAddr/PeerHost 261 SSL_npn_protocols => undef, # meaning depends whether on server or client side 262 SSL_honor_cipher_order => 0, # client order gets preference 263 );
…
332 ${*$self}{'_SSL_ctx'} = IO::Socket::SSL::SSL_Context->new($arg_hash) || return;
發送電子郵件
在 sendemail 結束時,我認為它在程式碼中:
1903 ## Start TLS if possible 1904 if ($conf{'tls_server'} == 1 and $conf{'tls_client'} == 1 and $opt{'tls'} =~ /^(yes|auto)$/) { 1905 printmsg("DEBUG => Starting TLS", 2); 1906 if (SMTPchat('STARTTLS')) { quit($conf{'error'}, 1); } 1907 if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) { 1908 quit("ERROR => TLS setup failed: " . IO::Socket::SSL::errstr(), 1); 1909 } 1910 printmsg("DEBUG => TLS: Using cipher: ". $SERVER->get_cipher(), 3); 1911 printmsg("DEBUG => TLS session initialized :)", 1); 1912 1913 ## Restart our SMTP session 1914 if (SMTPchat('EHLO ' . $opt{'fqdn'})) { quit($conf{'error'}, 1); } 1915 } 1916 elsif ($opt{'tls'} eq 'yes' and $conf{'tls_server'} == 0) { 1917 quit("ERROR => TLS not possible! Remote SMTP server, $conf{'server'}, does not support it.", 1); 1918 }
Debian 的錯誤跟踪網站上有一個錯誤報告: http ://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679911
它還說明了一種解決方法:
在命令行上指定
-o tls=no
為選項。感謝 debian.org 上的@Manolo Díaz。
其實只要取預設(去掉第二個參數)。請參閱https://metacpan.org/pod/IO::Socket::SSL(搜尋 SSL_version)。預設值為 SSLv23:!SSLv3:!SSLv2。
我將 v1.56 中的第 1906 行修改為閱讀
# if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3 TLSv1')) { if (! IO::Socket::SSL->start_SSL($SERVER)) {
(只是註釋掉原來的行)