ssl.pl


# @param string $cert filename
# @return arrayref
sub get_ssldomains
{
    my $cert = shift;

    my %doms;
    my $x509;

    eval { $x509 = Crypt::OpenSSL::X509->new_from_file($cert); } or do { return };

    my $cn = $x509->subject_name->get_entry_by_long_type('commonName')->as_string;
    $cn =~ s{^CN\=}{}g;
    $doms{$cn} = 1;

    if ($x509) {
        my $e;
        eval { $e = $x509->extensions_by_name(); };
        if ( exists $e->{subjectAltName} ) {
            my $san = $e->{subjectAltName}->to_string;
            if ( $san =~ /DNS:/ ) {
                $san =~ s{\s*,\s*}{}g;
                my @sans = split 'DNS:', $san;
                shift @sans if @sans > 0 and $sans[0] eq '';
                foreach my $altnam (@sans) {
                    $doms{$altnam} = 1;
                }
            }
        }
    }

    return [ keys %doms ];
}