Bom dia a todos,
Na semana passada, decidi executar os comandos para atualizar os pacotes no meu servidor 14.04 para garantir que eu fosse corrigido para as vulnerabilidades Bash encontradas recentemente. Por informações aqui ( link ) eu executei um apt-get dist-upgrade. Para referência, eu corri o apt-get update, o apt-get dist-upgrade e então o apt-get upgrade para tentar o & amp; Certifique-se que eu tinha tudo para as versões mais recentes (eu rotineiramente executar o upgrade do apt-get embora).
Depois de fazer isso com sucesso, descobri que vários dos meus scripts Perl não estavam mais funcionando. Para referência, eu uso este servidor para o Nagios para monitorar todos os meus outros servidores. Os scripts em questão que agora estão falhando, todos se conectam a um sistema via https, fazem login no host e consultam vários bits de informações.
Antes da atualização, consegui adicionar uma linha a cada um dos meus scripts Perl para ignorar o SSL:
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0 }
No entanto, após a atualização, isso parece não ter efeito, e todos os scripts falham porque não podem verificar os certificados SSL (todos auto-assinados).
Veja alguns recortes do que estou vendo:
Execução do script
:
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.
Este script Perl utiliza o "VMware Infrastructure (VI) Perl Toolkit" para funcionar. O script que estou chamando, check_esx.pl está disponível aqui
Aqui está um recorte do arquivo http.pm ao redor da linha referenciada no erro acima; a linha 41 é a linha "morrer".
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;
}
Então, acho que o que estou procurando aqui é uma das duas coisas
(A) Existe uma maneira nova / melhor / mais correta de fazer o Perl ignorar os certificados SSL? ou
(B) Existe uma maneira de importar um certificado SSL autoassinado de outro host para o Ubuntu para que o script Perl reconheça & amp; confia? Alternativamente:
(B-2) Existe uma maneira de fazer com que o Ubuntu reconheça meu Active Directory do Windows como Autoridade de Certificação, de modo que eu possa emitir certificados SSL da minha CA para os sistemas em questão e tê-los reconhecidos pelos scripts Perl?
Obrigado antecipadamente a todos!