みんなおはよう、
先週、私は14.04サーバーでパッケージをアップグレードするコマンドを実行して、最近発見されたBashの脆弱性に対するパッチが確実に適用されるようにしました。ここの情報に従って( http://www.ubuntu.com/usn/usn-2362-1/ )私はapt-get dist-upgradeを実行しました。参考までに、apt-get update、apt-get dist-upgrade、次にapt-get upgradeを実行して、最新バージョンまですべてが揃っていることを確認しました(ただし、apt-get upgradeを定期的に実行しています)。
これを正常に実行した後、私のPerlスクリプトの多くが機能しなくなっていることがわかりました。参考までに、このサーバーをNagiosに使用して、他のすべてのサーバーを監視します。現在問題となっている問題のスクリプトはすべて、https経由でシステムに接続し、ホストにログインして、さまざまな情報を照会します。
アップグレードの前に、SSLを無視するように各Perlスクリプトに行を追加することができました。
$ENV{Perl_LWP_SSL_VERIFY_HOSTNAME} = 0 }
ただし、アップグレード後は影響がないようで、SSL証明書(すべて自己署名)を検証できないため、スクリプトはすべて失敗します。
これが私が見ているものの一部です:
スクリプトの実行:
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.
この特定のPerlスクリプトは、「VMware Infrastructure(VI)Perl Toolkit」を利用して機能します。私が呼んでいるスクリプトcheck_esx.plが利用可能です here
上記のエラーで参照されている行の周りのファイルhttp.pmの一部を以下に示します。 41行目は「ダイ」ラインです。
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;
}
だから私がここで探しているのは2つのうちの1つだと思います
どちらか:(A)PerlにSSL証明書を無視させる新しい/より良い/より正しい方法はありますか?または(B)Perlスクリプトが認識して信頼できるように、自己署名SSL証明書を別のホストからUbuntuにインポートする方法はありますか?別の方法:(B-2)私のCAから問題のシステムにSSL証明書を発行して、Perlスクリプトで認識させるために、Ubuntuに私のWindows Active Directory Cert Authorityを認識させる方法はありますか?
みんなありがとう!
$ ENV {Perl_LWP_SSL_VERIFY_HOSTNAME} = 0
これはLWP(CVE-2014-3230)のバグであり、新しいバージョンで修正されました。 Perl_LWP_SSL_VERIFY_HOSTNAMEは、証明書チェーンではなく、証明書のホスト名の検証を省略するためにのみ使用されます。ただし、自己署名証明書チェーンを使用しているため、検証は失敗します。
このオプションは、古いCrypt :: SSLeayバックエンドから新しいIO :: Socket :: SSLバックエンドへの移行のためにのみ導入されました。 Crypt :: SSLeayはホスト名の検証をサポートしていないため(中間者攻撃に対して開かれています)、IO :: Socket :: SSLはサポートします。 LWPバージョン6では、デフォルトのバックエンドはIO :: Socket :: SSLです。
証明書セットの検証を完全に無効にするにはSSL_verify_mode => SSL_VERIFY_NONE
(必要がある use IO::Socket::SSL
SSL_VERIFY_NONE定数にアクセスするか、LWPのssl_optsで0)を使用します。これを行う環境変数はありません。
例:
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(...)
残念ながら、あなたが参照したスクリプトでLWPの使用を確認できないため、そこで修正する場所がわかりません。
オプションBについて:
(B)Perlスクリプトが認識して信頼できるように、自己署名SSL証明書を別のホストからUbuntuにインポートする方法はありますか?あるいは:(B-2)私のCAから問題のシステムにSSL証明書を発行し、Perlスクリプトで認識させるために、Ubuntuが私のWindows Active Directory Cert Authorityを認識させる方法はありますか?
環境変数Perl_LWP_SSL_CA_FILEを使用して、信頼できるCAまたは自己署名証明書を受け入れるファイルを指定できるはずです。
これはPerlバージョンの問題だと思います。そのスクリプトを実行するために以前に使用したPerlバージョンを確認してください。
私が確信しているのは、Ubuntuがすべてのソフトウェアの最新の安定したバージョンをインストールするということです。たとえば、ubuntu 12.04で実行されるpython3スクリプトがある場合、ubuntu 14.04では機能しない可能性があります。その理由は、もみがpython 3.2、後者がpython 3.4バージョン。
同じことがあなたのPerlスクリプトで起こっていると思います、Perlのバージョンと新しいバージョンのリリースノートをチェックしてください。