OpenSSL DH键太小错误

时间:2016-04-05 04:37:43

标签: perl ssl openssl

我正在尝试使用简单的PERL脚本连接到关闭的服务器 - 空调 -

var gameBoard = [
       ["X", "O", "X", "O", "X", "O"],
       ["X", "O", "X", "X", "X", "O"],
       ["X", "O", "O", "O", "X", "O"],
       ["X", "O", "X", "O", "X", "O"],
       ["X", "O", "X", "O", "X", "O"]

      ];

console.log(chkDiagonal("X",4,0));//undefined

现在,这一切都运行良好,然后我确切地更新了OpenSSL(libssl1.0.0),并且一切都崩溃了:

#!/usr/bin/perl

use 5.10.1;
use warnings;
use strict;
use IO::Socket::SSL;
use IO::Socket::SSL qw/debug3/;
my $sock = IO::Socket::SSL->new(
        PeerHost => '192.168.1.4',
        PeerPort => 2878,
        verify_hostname => 0,   
        SSL_verify_mode => SSL_VERIFY_NONE,
        SSL_verifycn_scheme => undef
) or die "failed connect or ssl handshake: $!,$SSL_ERROR";
print "$sock\n";

我很高兴使用任何替代方案来解决这个问题,但我确实需要绕过它,因为我无法更新空调上的证书......

我已经研究过使用LWP和raw Net:SSLeay,但问题似乎出现在底层的OpenSSL库中。

2 个答案:

答案 0 :(得分:6)

... SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
     

我已经研究过使用LWP和raw Net:SSLeay,但问题似乎出现在底层的OpenSSL库中。

虽然它是由OpenSSL的更改引起的,但问题实际上是在服务器端。服务器在密钥交换中使用弱DH密钥,并且由于Logjam attack,最近版本的OpenSSL强制执行非弱DH密钥。

如果服务器支持不使用DH密钥交换的密码,您可以通过限制客户端提供的密码来解决问题,这样他们就不会包含任何DH密码。

my $sock = IO::Socket::SSL->new(..., SSL_cipher_list => 'DEFAULT:!DH' ...);

除此之外,简单地禁用任何验证都是不好的:

    ...
    verify_hostname => 0,   
    SSL_verify_mode => SSL_VERIFY_NONE,
    SSL_verifycn_scheme => undef

首先,verify_hostname根本不是有效参数(仅适用于LWP)。另外,如果您使用SSL_verifycn_scheme禁用验证,则不需要设置SSL_verify_mode,因为没有验证也意味着不会对证书主题进行验证。

但是,比禁用验证要好得多的是使用SSL_fingerprint来指定您期望的证书,从而对自签名证书或过期证书进行适当的检查。有关详细信息,请参阅IO :: Socket :: SSL文档中的common usage errors

答案 1 :(得分:2)

就我而言,唯一的解决方案是在/etc/ssl/openssl.cnf中设置CipherString 来自

CipherString = DEFAULT@SECLEVEL=2

CipherString = DEFAULT@SECLEVEL=1