# HG changeset patch # User Andrey Zelenkov # Date 1483026844 -10800 # Node ID b3d5a2f8a00b717e9a57e36784dd91fe8d11dd19 # Parent 71bba21ea3ed33b4b961f2f057f00efe80e9fce2 Tests: stream ssl_verify_client tests. diff --git a/stream_ssl_verify_client.t b/stream_ssl_verify_client.t new file mode 100644 --- /dev/null +++ b/stream_ssl_verify_client.t @@ -0,0 +1,118 @@ +#!/usr/bin/perl + +# (C) Sergey Kandaurov +# (C) Andrey Zelenkov +# (C) Nginx, Inc. + +# Tests for stream ssl module, ssl_verify_client. + +############################################################################### + +use warnings; +use strict; + +use Test::More; + +use Socket; + +BEGIN { use FindBin; chdir($FindBin::Bin); } + +use lib 'lib'; +use Test::Nginx; +use Test::Nginx::Stream qw/ stream /; + +############################################################################### + +select STDERR; $| = 1; +select STDOUT; $| = 1; + +eval { + require Net::SSLeay; + Net::SSLeay::load_error_strings(); + Net::SSLeay::SSLeay_add_ssl_algorithms(); + Net::SSLeay::randomize(); +}; +plan(skip_all => 'Net::SSLeay not installed') if $@; + +my $t = Test::Nginx->new()->has(qw/stream stream_ssl stream_return/) + ->has_daemon('openssl'); + +$t->write_file_expand('nginx.conf', <<'EOF'); + +%%TEST_GLOBALS%% + +daemon off; + +events { +} + +stream { + ssl_certificate_key localhost.key; + ssl_certificate localhost.crt; + + ssl_verify_client optional_no_ca; + + server { + listen 127.0.0.1:8080 ssl; + return $ssl_client_verify; + + ssl_client_certificate client.crt; + } + + server { + listen 127.0.0.1:8081 ssl; + return $ssl_client_verify; + } +} + +EOF + +my $d = $t->testdir(); + +$t->write_file('openssl.conf', <>$d/openssl.out 2>&1") == 0 + or die "Can't create certificate for $name: $!\n"; +} + +my $ctx = Net::SSLeay::CTX_new() or die("Failed to create SSL_CTX $!"); +Net::SSLeay::set_cert_and_key($ctx, "$d/client.crt", "$d/client.key") or die; + +$t->try_run('no ssl_verify_client')->plan(2); + +############################################################################### + +my ($s, $ssl) = get_ssl_socket(port(8080)); +is(Net::SSLeay::read($ssl), 'SUCCESS', 'success'); + +($s, $ssl) = get_ssl_socket(port(8081)); +like(Net::SSLeay::read($ssl), qr/FAILED/, 'failed'); + +############################################################################### + +sub get_ssl_socket { + my ($port) = @_; + + my $dest_ip = inet_aton('127.0.0.1'); + my $dest_serv_params = sockaddr_in($port, $dest_ip); + + socket(my $s, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!"; + connect($s, $dest_serv_params) or die "connect: $!"; + + my $ssl = Net::SSLeay::new($ctx) or die("Failed to create SSL $!"); + Net::SSLeay::set_fd($ssl, fileno($s)); + Net::SSLeay::connect($ssl) or die("ssl connect"); + return ($s, $ssl); +} + +###############################################################################