Nach der Ausführung von apt-get dist-upgrade ignorieren Perl-Skripte ungültige SSL-Zertifikate unter 14.04 nicht mehr.

Nach der Ausführung von apt-get dist-upgrade ignorieren Perl-Skripte ungültige SSL-Zertifikate unter 14.04 nicht mehr.

Guten Morgen alle,

Letzte Woche habe ich beschlossen, die Befehle zum Aktualisieren von Paketen auf meinem 14.04-Server auszuführen, um sicherzustellen, dass ich für die kürzlich entdeckten Bash-Sicherheitslücken gepatcht bin. Gemäß den Informationen hier (http://www.ubuntu.com/usn/usn-2362-1/) Ich habe ein apt-get dist-upgrade ausgeführt. Als Referenz habe ich apt-get update, apt-get dist-upgrade und dann apt-get upgrade ausgeführt, um sicherzustellen, dass ich alles auf dem neuesten Stand habe (ich führe jedoch routinemäßig apt-get upgrade aus).

Nachdem ich dies erfolgreich durchgeführt hatte, stellte ich fest, dass einige meiner Perl-Skripte nicht mehr funktionierten. Als Referenz verwende ich diesen Server für Nagios, um alle meine anderen Server zu überwachen. Die betreffenden Skripte, die jetzt ausfallen, stellen alle über https eine Verbindung zu einem System her, melden sich beim Host an und fragen verschiedene Informationen ab.

Vor dem Upgrade konnte ich jedem meiner Perl-Skripte eine Zeile hinzufügen, damit SSL ignoriert wird:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0 } 

Nach dem Upgrade scheint dies jedoch keine Auswirkungen mehr zu haben und alle Skripte schlagen fehl, da sie die SSL-Zertifikate (alle selbst signiert) nicht überprüfen können.

Hier sind einige Ausschnitte von dem, was ich sehe:

Skriptausführung:

    nagios@nagios:/usr/local/nagios/libexec$ ./check_esx.pl -H 192.168.22.18 -u root -p password -l cpu
CHECK_ESX.PL CRITICAL - Can't connect to 192.168.22.18:443 (certificate verify failed)

LWP::Protocol::https::Socket: SSL connect attempt failed error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /usr/share/perl5/LWP/Protocol/http.pm line 41.

Dieses spezielle Perl-Skript verwendet das "VMware Infrastructure (VI) Perl Toolkit", um zu funktionieren. Das Skript, das ich aufrufe, check_esx.pl, ist verfügbarHier

Hier ist ein Ausschnitt der Datei http.pm rund um die Zeile, auf die im obigen Fehler verwiesen wird; Zeile 41 ist die „die“-Zeile.

sub _new_socket
{
    my($self, $host, $port, $timeout) = @_;

    local($^W) = 0;  # IO::Socket::INET can be noisy
    my $sock = $self->socket_class->new(PeerAddr => $host,
                                        PeerPort => $port,
                                        LocalAddr => $self->{ua}{local_address},
                                        Proto    => 'tcp',
                                        Timeout  => $timeout,
                                        KeepAlive => !!$self->{ua}{conn_cache},
                                        SendTE    => 1,
                                        $self->_extra_sock_opts($host, $port),
                                       );

    unless ($sock) {
        # IO::Socket::INET leaves additional error messages in $@
        my $status = "Can't connect to $host:$port";
        if ($@ =~ /\bconnect: (.*)/ ||
            $@ =~ /\b(Bad hostname)\b/ ||
            $@ =~ /\b(certificate verify failed)\b/ ||
            $@ =~ /\b(Crypt-SSLeay can't verify hostnames)\b/
        ) {
            $status .= " ($1)";
        }
        die "$status\n\n$@";
    }

    # perl 5.005's IO::Socket does not have the blocking method.
    eval { $sock->blocking(0); };

    $sock;
}

Ich schätze, was ich hier suche, ist eines von zwei Dingen

Entweder: (A) Gibt es eine neue/bessere/korrektere Möglichkeit, Perl dazu zu bringen, die SSL-Zertifikate zu ignorieren? oder (B) Gibt es eine Möglichkeit, ein selbst signiertes SSL-Zertifikat von einem anderen Host in Ubuntu zu importieren, sodass das Perl-Skript es erkennt und ihm vertraut? Alternativ: (B-2) Gibt es eine Möglichkeit, Ubuntu dazu zu bringen, meine Windows Active Directory-Zertifizierungsstelle zu erkennen, sodass ich SSL-Zertifikate von meiner Zertifizierungsstelle an die betreffenden Systeme ausstellen und von den Perl-Skripten erkannt werden kann?

Vielen Dank im Voraus an alle!

Antwort1

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0

Dies war ein Fehler in LWP (CVE-2014-3230), der in neueren Versionen behoben wurde. PERL_LWP_SSL_VERIFY_HOSTNAME wird nur verwendet, um die Überprüfung des Hostnamens im Zertifikat wegzulassen, nicht die der Zertifikatskette. Da Sie jedoch eine selbstsignierte Zertifikatskette verwenden, schlägt die Überprüfung fehl.

Diese Option wurde nur für die Migration vom alten Crypt::SSLeay-Backend zum neuen IO::Socket::SSL-Backend eingeführt. Crypt::SSLeay unterstützt keine Überprüfung des Hostnamens (und ist daher anfällig für Man-in-the-Middle-Angriffe), während IO::Socket::SSL dies tut. Mit LWP Version 6 ist IO::Socket::SSL das Standard-Backend.

Um die Überprüfung des Zertifikatssatzes in den ssl_opts von LWP vollständig zu deaktivieren SSL_verify_mode => SSL_VERIFY_NONE(Sie müssen use IO::Socket::SSLZugriff auf die Konstante SSL_VERIFY_NONE haben oder einfach 0 verwenden). Es gibt keine Umgebungsvariable, um dies zu tun.

Beispiel:

use LWP::UserAgent;
use IO::Socket::SSL;
my $ua = LWP::UserAgent->new(..., ssl_opts => { SSL_verify_mode => SSL_VERIFY_NONE });
$ua->get(...); # or $ua->post(...) or $ua->request(...)

Leider kann ich in dem von Ihnen referenzierten Skript keine Verwendung von LWP erkennen und weiß daher nicht, wo ich es dort beheben kann.

Was Ihre Option B betrifft:

(B) Gibt es eine Möglichkeit, ein selbst signiertes SSL-Zertifikat von einem anderen Host in Ubuntu zu importieren, sodass das Perl-Skript es erkennt und ihm vertraut? Alternativ: (B-2) Gibt es eine Möglichkeit, Ubuntu dazu zu bringen, meine Windows Active Directory-Zertifizierungsstelle zu erkennen, sodass ich SSL-Zertifikate von meiner Zertifizierungsstelle an die betreffenden Systeme ausstellen und von den Perl-Skripten erkennen lassen kann?

Sie sollten in der Lage sein, die Umgebungsvariable PERL_LWP_SSL_CA_FILE zu verwenden, um eine Datei anzugeben, welche CAs oder selbstsignierten Zertifikate Sie als vertrauenswürdig akzeptieren.

Antwort2

Ich glaube, es liegt an der Perl-Version. Überprüfen Sie, welche Perl-Version Sie zuvor zum Ausführen des Skripts verwendet haben.

Ich bin mir sicher, dass Ubuntu die neueste stabile Version jeder Software installiert. Nehmen wir beispielsweise an, Sie haben ein Python3-Skript, das unter Ubuntu 12.04 läuft, es funktioniert unter Ubuntu 14.04 möglicherweise nicht. Der Grund dafür ist, dass das erste Python 3.2 hat, während das zweite die Python-Version 3.4 hat.

Ich gehe davon aus, dass mit Ihrem Perl-Skript dasselbe passiert ist. Überprüfen Sie die Perl-Version und die Versionshinweise der neuen Version.

verwandte Informationen