perl OpenSSL DH密钥太小错误

k7fdbhmy  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(317)

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

#!/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";

现在,这一切都运行得很好,然后我更新了OpenSSL(libssl1.0.0),更确切地说,所有的地狱打破了松散:

DEBUG: .../IO/Socket/SSL.pm:220: set domain to 2
DEBUG: .../IO/Socket/SSL.pm:1653: new ctx 1984680
DEBUG: .../IO/Socket/SSL.pm:363: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:365: socket connected
DEBUG: .../IO/Socket/SSL.pm:383: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:446: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:1328: SSL connect attempt failed with unknown error error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small

DEBUG: .../IO/Socket/SSL.pm:452: fatal SSL error: SSL connect attempt failed with unknown error error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
DEBUG: .../IO/Socket/SSL.pm:1328: IO::Socket::INET6 configuration failed error:00000000:lib(0):func(0):reason(0)

DEBUG: .../IO/Socket/SSL.pm:1690: free ctx 1984680 open=1984680
DEBUG: .../IO/Socket/SSL.pm:1698: OK free ctx 1984680
failed connect or ssl handshake: ,IO::Socket::INET6 configuration failed error:00000000:lib(0):func(0):reason(0) at ./spare line 9.

我很乐意使用任何替代软件包来解决这个问题,但我确实需要解决它,因为我不能更新空调的证书...
我已经考虑过使用LWP和raw Net:SSLeay,但问题似乎出在底层的OpenSSL库中。

u1ehiz5o

u1ehiz5o1#

... 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_verify_mode验证,则不需要设置SSL_verifycn_scheme,因为没有验证也意味着没有对证书主题进行验证。
但是,使用SSL_fingerprint来指定您希望使用的证书比禁用验证要好得多,这样即使是自签名证书或过期证书也可以进行正确的检查。有关更多信息,请参阅IO::Socket::SSL文档中的常见用法错误。

jmo0nnb3

jmo0nnb32#

在我的例子中,唯一的解决方案是从/etc/ssl/openssl.cnf中设置CipherString

CipherString = DEFAULT@SECLEVEL=2

CipherString = DEFAULT@SECLEVEL=1
zz2j4svz

zz2j4svz3#

对于OpenVPN文件,添加以下条目到您的.ovpn文件:

tls-cipher "DEFAULT:@SECLEVEL=0"

请访问:https://forums.openvpn.net/viewtopic.php?t=23979#p71603

ojsjcaue

ojsjcaue4#

dh key too small的正确解决方案是使用以下命令为服务器生成新的DH 2048密钥:
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
然后在/etc/openvpn/server.conf中将dh dh1024.pem更改为dh dh2048.pem,并重新启动openVPN服务器。
(in在此之后,客户端配置不需要更改)
资料来源:
https://kudzia.eu/b/2019/08/openvpn-openssl-error1408518assl-routinesssl3_ctx_ctrldh-key-too-small-after-upgrade-to-debina-buster/
如果(更改上述内容后)您还面临错误TLS error: Unsupported protocol,这意味着客户端具有旧的openssl版本,克服此问题的方法是添加:
tls-version-min 1.0
并重新启动openvpn服务器。
(also之后不需要更改客户端配置)
资料来源:
https://community.openvpn.net/openvpn/ticket/1211

相关问题