@ -134,8 +134,13 @@ note "running client tests";
switch_server_cert ( $ node , 'server-cn-only' ) ;
# Set of default settings for SSL parameters in connection string. This
# makes the tests protected against any defaults the environment may have
# in ~/.postgresql/.
my $ default_ssl_connstr = "sslkey=invalid sslcert=invalid sslrootcert=invalid sslcrl=invalid sslcrldir=invalid" ;
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test" ;
# The server should not accept non-SSL connections.
$ node - > connect_fails (
@ -212,9 +217,10 @@ $node->connect_fails(
"CRL belonging to a different CA" ,
expected_stderr = > qr/SSL error: certificate verify failed/ ) ;
# The same for CRL directory
# The same for CRL directory. sslcrl='' is added here to override the
# invalid default, so as this does not interfere with this case.
$ node - > connect_fails (
"$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/client-crldir" ,
"$common_connstr sslcrl='' ssl rootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/client-crldir" ,
"directory CRL belonging to a different CA" ,
expected_stderr = > qr/SSL error: certificate verify failed/ ) ;
@ -231,7 +237,7 @@ $node->connect_ok(
# Check that connecting with verify-full fails, when the hostname doesn't
# match the hostname in the server's certificate.
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR" ;
$ node - > connect_ok ( "$common_connstr sslmode=require host=wronghost.test" ,
"mismatch between host name and server certificate sslmode=require" ) ;
@ -249,7 +255,7 @@ $node->connect_fails(
switch_server_cert ( $ node , 'server-multiple-alt-names' ) ;
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full" ;
$ node - > connect_ok (
"$common_connstr host=dns1.alt-name.pg-ssltest.test" ,
@ -278,7 +284,7 @@ $node->connect_fails(
switch_server_cert ( $ node , 'server-single-alt-name' ) ;
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full" ;
$ node - > connect_ok (
"$common_connstr host=single.alt-name.pg-ssltest.test" ,
@ -302,7 +308,7 @@ $node->connect_fails(
switch_server_cert ( $ node , 'server-cn-and-alt-names' ) ;
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR sslmode=verify-full" ;
$ node - > connect_ok ( "$common_connstr host=dns1.alt-name.pg-ssltest.test" ,
"certificate with both a CN and SANs 1" ) ;
@ -319,7 +325,7 @@ $node->connect_fails(
# not a very sensible certificate, but libpq should handle it gracefully.
switch_server_cert ( $ node , 'server-no-names' ) ;
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR" ;
$ node - > connect_ok (
"$common_connstr sslmode=verify-ca host=common-name.pg-ssltest.test" ,
@ -335,7 +341,7 @@ $node->connect_fails(
switch_server_cert ( $ node , 'server-revoked' ) ;
$ common_connstr =
"user=ssltestuser dbname=trustdb sslcert=invalid hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test" ;
"$default_ssl_connstr user=ssltestuser dbname=trustdb hostaddr=$SERVERHOSTADDR host=common-name.pg-ssltest.test" ;
# Without the CRL, succeeds. With it, fails.
$ node - > connect_ok (
@ -345,8 +351,10 @@ $node->connect_fails(
"$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrl=ssl/root+server.crl" ,
"does not connect with client-side CRL file" ,
expected_stderr = > qr/SSL error: certificate verify failed/ ) ;
# sslcrl='' is added here to override the invalid default, so as this
# does not interfere with this case.
$ node - > connect_fails (
"$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/root+server-crldir" ,
"$common_connstr sslcrl='' ssl rootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/root+server-crldir" ,
"does not connect with client-side CRL directory" ,
expected_stderr = > qr/SSL error: certificate verify failed/ ) ;
@ -388,7 +396,7 @@ $node->connect_fails(
note "running server tests" ;
$ common_connstr =
"sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost" ;
"$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=certdb hostaddr=$SERVERHOSTADDR host=localhost" ;
# no client cert
$ node - > connect_fails (
@ -538,7 +546,7 @@ $node->connect_fails(
# works, iff username matches Common Name
# fails, iff username doesn't match Common Name.
$ common_connstr =
"sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=verifydb hostaddr=$SERVERHOSTADDR host=localhost" ;
"$default_ssl_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require dbname=verifydb hostaddr=$SERVERHOSTADDR host=localhost" ;
$ node - > connect_ok (
"$common_connstr user=ssltestuser sslcert=ssl/client.crt sslkey=ssl/client_tmp.key" ,
@ -565,7 +573,7 @@ $node->connect_ok(
# intermediate client_ca.crt is provided by client, and isn't in server's ssl_ca_file
switch_server_cert ( $ node , 'server-cn-only' , 'root_ca' ) ;
$ common_connstr =
"user=ssltestuser dbname=certdb sslkey=ssl/client_tmp.key sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR host=localhost" ;
"$default_ssl_connstr user=ssltestuser dbname=certdb sslkey=ssl/client_tmp.key sslrootcert=ssl/root+server_ca.crt hostaddr=$SERVERHOSTADDR host=localhost" ;
$ node - > connect_ok (
"$common_connstr sslmode=require sslcert=ssl/client+client_ca.crt" ,