apt-get dist-upgrade Perl 스크립트를 수행한 후 14.04에서 더 이상 유효하지 않은 SSL 인증서를 무시하지 않습니다.

apt-get dist-upgrade Perl 스크립트를 수행한 후 14.04에서 더 이상 유효하지 않은 SSL 인증서를 무시하지 않습니다.

모두 좋은 아침이에요

지난주에 저는 최근에 발견된 Bash 취약점에 대한 패치가 적용되었는지 확인하기 위해 14.04 서버에서 패키지를 업그레이드하는 명령을 실행하기로 결정했습니다. 여기 정보에 따라(http://www.ubuntu.com/usn/usn-2362-1/) apt-get dist-upgrade를 실행했습니다. 참고로 저는 apt-get update, apt-get dist-upgrade를 실행한 다음 apt-get 업그레이드를 실행하여 모든 것이 최신 버전인지 확인했습니다(그러나 저는 정기적으로 apt-get 업그레이드를 실행합니다).

이 작업을 성공적으로 수행한 후 여러 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을 사용할 수 있습니다.여기

다음은 위 오류에서 참조된 줄 주위에 있는 http.pm 파일의 일부입니다. 41번째 줄은 "die" 줄입니다.

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;
}

그래서 제가 여기서 찾고 있는 것은 두 가지 중 하나인 것 같습니다.

(A) Perl이 SSL 인증서를 무시하도록 하는 새롭고 더 나은/더 정확한 방법이 있습니까? 또는 (B) Perl 스크립트가 이를 인식하고 신뢰할 수 있도록 자체 서명된 SSL 인증서를 다른 호스트에서 Ubuntu로 가져올 수 있는 방법이 있습니까? 대안: (B-2) 내 CA에서 문제의 시스템으로 SSL 인증서를 발급하고 Perl 스크립트에서 이를 인식할 수 있도록 Ubuntu가 내 Windows 활성 디렉터리 인증 기관을 인식하도록 하는 방법이 있습니까?

미리 감사드립니다!

답변1

$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입니다.

LWP의 ssl_opts에서 인증서 세트 확인을 완전히 비활성화하려면 SSL_verify_mode => SSL_VERIFY_NONE(SSL_VERIFY_NONE 상수에 대한 액세스 권한이 있거나 0만 사용해야 함 ) use IO::Socket::SSL이를 수행할 환경 변수는 없습니다.

예:

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 활성 디렉터리 인증 기관을 인식하도록 하는 방법이 있습니까?

환경 변수 PERL_LWP_SSL_CA_FILE을 사용하여 신뢰할 수 있는 CA 또는 자체 서명 인증서를 허용하는 파일을 지정할 수 있어야 합니다.

답변2

Perl 버전 문제인 것 같습니다. 해당 스크립트를 실행하기 위해 이전에 어떤 Perl 버전을 사용했는지 확인하십시오.

내가 확신하는 것은 Ubuntu가 모든 소프트웨어의 최신 안정 버전을 설치한다는 것입니다. 예를 들어 우분투 12.04에서 실행되는 python3 스크립트가 있는 경우 우분투 14.04에서는 작동하지 않을 수 있으며 그 이유는 첫 번째에는 Python 3.2가 있고 후자에는 Python 3.4 버전이 있기 때문입니다.

Perl 스크립트, Perl 버전 및 새 버전의 릴리스 노트에서도 동일한 일이 발생한다고 가정합니다.

관련 정보