#!/usr/bin/env perl use strict; use warnings; use Socket; use WgetFeature qw(https); use SSLTest; use File::Remove 'remove'; ############################################################################### my @tempfiles; # code, msg, headers, content my %urls = ( '/somefile.txt' => { code => "200", msg => "Dontcare", headers => { "Content-type" => "text/plain", }, content => "blabla", }, ); # Skip the test if openssl is not available my $ossl = `openssl version`; unless ($ossl =~ m/OpenSSL 1/) { exit 77; } my $srcdir; if (@ARGV) { $srcdir = shift @ARGV; } elsif (defined $ENV{srcdir}) { $srcdir = $ENV{srcdir}; } $srcdir = Cwd::abs_path("$srcdir"); my $cdir = $ENV{'PWD'}; # HOSTALIASES env variable allows us to create hosts file alias. my $testhostname = "WgetTestingServer"; $ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts"; my $addr = gethostbyname($testhostname); unless ($addr) { warn "Failed to resolve $addr, using $srcdir/certs/wgethosts\n"; exit 77; } unless (inet_ntoa($addr) =~ "127.0.0.1") { warn "Failed to resolve $$addr, using $srcdir/certs/wgethosts\n"; exit 77; } # Create certindex my $certindex = "$cdir/certindex"; push (@tempfiles, $certindex); open CERTID, ">", $certindex or warn "Cannot overwrite file $certindex"; close CERTID; # Create certserial my $certserial = "$cdir/certserial"; push (@tempfiles, $certserial); open CERTSN, ">", $certserial or warn "Cannot overwrite file $certserial"; print CERTSN "1122"; close CERTSN; # Create crlnumber my $crlnumber = "$cdir/crlnumber"; push (@tempfiles, $crlnumber); open CRLN, ">", $crlnumber or warn "Cannot overwrite file $crlnumber"; close CRLN; my $caconf = "$srcdir/certs/rootca.conf"; my $cacrt = "$srcdir/certs/test-ca-cert.pem"; my $cakey = "$srcdir/certs/test-ca-key.pem"; # Prepare server certificate my $servercrt = "$cdir/tmpserver$$.crt"; my $serverkey = "$cdir/tmpserver$$.key"; my $servercsr = "$cdir/tmpserver$$.csr"; push (@tempfiles, , $servercrt, $serverkey, $servercsr); my $serversubj = "/C=US/ST=CA/L=Server Mystery Spot/O=Serv/CN=". "$testhostname/emailAddress=servertester"; my $servercmd = "openssl genrsa -out $serverkey 4096 && openssl req -new". " -sha256 -key $serverkey -out $servercsr -days 365 ". " -subj \"$serversubj\" &&". "openssl ca -batch -config $caconf -notext -in $servercsr". " -out $servercrt"; system($servercmd); my $servercheck =`(openssl x509 -noout -modulus -in $servercrt | openssl md5 ; openssl rsa -noout -modulus -in $serverkey | openssl md5) | uniq | wc -l`; # Check if certificate and key are made correctly. unless(-e $servercrt && -e $serverkey && $servercheck == 1) { exit 77; # skip } # Prepare client certificate my $clientcert = "$cdir/client.crt"; my $clientkey = "$cdir/client.key"; my $clientcsr = "$cdir/client.csr"; push (@tempfiles, , $clientcert, $clientkey, $clientcsr); my $clientsubj = "/C=US/ST=CA/L=Client Mystery Spot/O=Client/CN=". "Client Tester/emailAddress=clienttester"; my $clientcertcmd = "openssl genrsa -out $clientkey 4096 &&". " openssl req -new -key $clientkey -out $clientcsr". " -subj \"$clientsubj\" &&". " openssl ca -config $caconf -in $clientcsr ". " -out $clientcert -batch"; system($clientcertcmd); my $clientcheck=`(openssl x509 -noout -modulus -in $clientcert | openssl md5 ; openssl rsa -noout -modulus -in $clientkey | openssl md5) | uniq | wc -l`; # Check if signed certificate and key are made correctly. unless(-e $clientcert && -e $clientkey && $clientcheck == 1) { exit 77; # skip } # Try Wget using SSL with mismatched client cert & key . Expect error my $port = 21443; my $cmdline = $WgetTest::WGETPATH . " --certificate=$clientcert ". " --private-key=$serverkey ". " --ca-certificate=$cacrt". " https://$testhostname:$port/somefile.txt"; my $expected_error_code = 5; my %existing_files = ( ); my %expected_downloaded_files = ( 'somefile.txt' => { content => "blabla", }, ); my $sslsock = SSLTest->new(cmdline => $cmdline, input => \%urls, errcode => $expected_error_code, existing => \%existing_files, output => \%expected_downloaded_files, certfile => $servercrt, keyfile => $serverkey, lhostname => $testhostname, sslport => $port); if ($sslsock->run() == 0) { exit 0; } # Retry wget using SSL with client certificate. Expect success $port = 22443; $cmdline = $WgetTest::WGETPATH . " --certificate=$clientcert". " --private-key=$clientkey ". " --ca-certificate=$cacrt". " https://$testhostname:$port/somefile.txt"; $expected_error_code = 0; my $retryssl = SSLTest->new(cmdline => $cmdline, input => \%urls, errcode => $expected_error_code, existing => \%existing_files, output => \%expected_downloaded_files, certfile => $servercrt, keyfile => $serverkey, lhostname => $testhostname, sslport => $port); exit $retryssl->run(); # vim: et ts=4 sw=4 END { print "remove(@tempfiles);\n"; remove(@tempfiles); }