在/usr/share/perl5/IO/Socket/SSL.pm第332行指定的SSL_version无效


9

由于我将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     }

1
通过将sendemail行1907中的“ SSLv3 TLSv1”更改为“ SSLv3”暂时解决了该问题,但是编辑从软件包安装的文件很糟糕
jippie 2012年

在新的debian版本中,我仍然遇到这个问题,但是我现在找不到该行...除了忽略tls,其他解决方案都无法正常工作。=(
Luciano Andress Martini

Answers:



4

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

我的问题是此修复程序破坏了Net :: Twitter
Dave Jacoby 2014年

1
Ubuntu 14.04中的1690行/usr/share/perl5/IO/Socket/SSL.pm
Rahul Patil

由于某些人仍然认为此答案中的解决方法是修复程序,并且抱怨IO :: Socket :: SSL中的错误:问题不在IO :: Socket :: SSL中,而是sendEmail中的错误,自2009年。详细地说:SSL_version的语法是错误的,并且在编写代码时甚至无效,只有IO :: Socket :: SSL才没有抱怨。解决方法只是从sendemail中删除SSL_version的设置。另请参见rt.cpan.org/Public/Bug/Display.html?id=77401
斯特芬·乌尔里希


2

如上所示,如果在修复SSLversion后仍然出现证书错误,则需要禁用证书检查:

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

我已经很久没有见到这个问题了,而ubuntu软件包已经修复了一段时间。解决此问题的第一个尝试应该是修补系统/使用最新版本的软件。但是,从另一个角度来看,替代解决方案也很有趣。
jippie

0
if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv3')) {<br>

使用sendEmail 1.56-2和libio-socket-ssl-perl 1.76-2处理debian wheezy

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

适用于... / IO / Socket / SSL.pm:1.74 sendEmail:1.56(在Ubuntu中)。

一年多来,这在ubuntu和debian仓库中一直是一个问题。


0

为了解决这个问题,我在第1884行编辑了sendEmail-v1.55,将“ SSLv3 TLSv1”更改为“ SSLv3”。

OSX 10.10.1


-1

为我工作

if (! IO::Socket::SSL->start_SSL($SERVER, SSL_version => 'SSLv23:!SSLv2')) {
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.