SSL.pm

SSL.pm

由于我将电脑从 (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     }

答案1

Debian 的错误跟踪网站上有一个错误报告: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=679911

它还指出了一个解决方法:

指定-o tls=no为命令行上的选项。

感谢 debian.org 上的@Manolo Díaz。

答案2

实际上,只需使用默认值即可(删除第二个参数)。看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)) {

(只是注释掉原来的行)

答案3

更简单的解决方法是:

代替:

m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i

和:

m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i

答案4

如果修复 SSL 版本后仍然出现证书错误(如上所示),则需要禁用证书检查:

if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2', SSL_verify_mode => 0)) {

相关内容