mirror of
https://github.com/postgres/postgres.git
synced 2025-09-06 13:46:51 +03:00
Allow specifying CRL directory
Add another method to specify CRLs, hashed directory method, for both server and client side. This offers a means for server or libpq to load only CRLs that are required to verify a certificate. The CRL directory is specifed by separate GUC variables or connection options ssl_crl_dir and sslcrldir, alongside the existing ssl_crl_file and sslcrl, so both methods can be used at the same time. Author: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/20200731.173911.904649928639357911.horikyota.ntt@gmail.com
This commit is contained in:
@@ -30,12 +30,15 @@ SSLFILES := $(CERTIFICATES:%=ssl/%.key) $(CERTIFICATES:%=ssl/%.crt) \
|
||||
ssl/client+client_ca.crt ssl/client-der.key \
|
||||
ssl/client-encrypted-pem.key ssl/client-encrypted-der.key
|
||||
|
||||
SSLDIRS := ssl/client-crldir ssl/server-crldir \
|
||||
ssl/root+client-crldir ssl/root+server-crldir
|
||||
|
||||
# This target re-generates all the key and certificate files. Usually we just
|
||||
# use the ones that are committed to the tree without rebuilding them.
|
||||
#
|
||||
# This target will fail unless preceded by sslfiles-clean.
|
||||
#
|
||||
sslfiles: $(SSLFILES)
|
||||
sslfiles: $(SSLFILES) $(SSLDIRS)
|
||||
|
||||
# OpenSSL requires a directory to put all generated certificates in. We don't
|
||||
# use this for anything, but we need a location.
|
||||
@@ -147,9 +150,28 @@ ssl/root+server.crl: ssl/root.crl ssl/server.crl
|
||||
ssl/root+client.crl: ssl/root.crl ssl/client.crl
|
||||
cat $^ > $@
|
||||
|
||||
ssl/root+server-crldir: ssl/server.crl ssl/root.crl
|
||||
mkdir ssl/root+server-crldir
|
||||
cp ssl/server.crl ssl/root+server-crldir/`openssl crl -hash -noout -in ssl/server.crl`.r0
|
||||
cp ssl/root.crl ssl/root+server-crldir/`openssl crl -hash -noout -in ssl/root.crl`.r0
|
||||
|
||||
ssl/root+client-crldir: ssl/client.crl ssl/root.crl
|
||||
mkdir ssl/root+client-crldir
|
||||
cp ssl/client.crl ssl/root+client-crldir/`openssl crl -hash -noout -in ssl/client.crl`.r0
|
||||
cp ssl/root.crl ssl/root+client-crldir/`openssl crl -hash -noout -in ssl/root.crl`.r0
|
||||
|
||||
ssl/server-crldir: ssl/server.crl
|
||||
mkdir ssl/server-crldir
|
||||
cp ssl/server.crl ssl/server-crldir/`openssl crl -hash -noout -in ssl/server.crl`.r0
|
||||
|
||||
ssl/client-crldir: ssl/client.crl
|
||||
mkdir ssl/client-crldir
|
||||
cp ssl/client.crl ssl/client-crldir/`openssl crl -hash -noout -in ssl/client.crl`.r0
|
||||
|
||||
.PHONY: sslfiles-clean
|
||||
sslfiles-clean:
|
||||
rm -f $(SSLFILES) ssl/client_ca.srl ssl/server_ca.srl ssl/client_ca-certindex* ssl/server_ca-certindex* ssl/root_ca-certindex* ssl/root_ca.srl ssl/temp_ca.crt ssl/temp_ca_signed.crt
|
||||
rm -rf $(SSLDIRS)
|
||||
|
||||
clean distclean maintainer-clean:
|
||||
rm -rf tmp_check
|
||||
|
11
src/test/ssl/ssl/client-crldir/9bb9e3c3.r0
Normal file
11
src/test/ssl/ssl/client-crldir/9bb9e3c3.r0
Normal file
@@ -0,0 +1,11 @@
|
||||
-----BEGIN X509 CRL-----
|
||||
MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ
|
||||
b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0xODEx
|
||||
MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBAhcNMTgxMTI3MTM0MDU1WjAN
|
||||
BgkqhkiG9w0BAQsFAAOCAQEAXjLxA9Qc6gAudwUHBxMIq5EHBcuNEX5e3GNlkyNf
|
||||
8I0DtHTPfJPvmAG+i6lYz//hHmmjxK0dR2ucg79XgXI/6OpDqlxS/TG1Xv52wA1p
|
||||
xz6GaJ2hC8Lk4/vbJo/Rrzme2QsI7xqBWya0JWVrehttqhFxPzWA5wID8X7G4Kb4
|
||||
pjVnzqYzn8A9FBiV9t10oZg60aVLqt3kbyy+U3pefvjhj8NmQc7uyuVjWvYZA0vG
|
||||
nnDUo4EKJzHNIYLk+EfpzKWO2XAWBLOT9SyyNCeMuQ5p/2pdAt9jtWHenms2ajo9
|
||||
2iUsHS91e3TooP9yNYuNcN8/wXY6H2Xm+dCLcEnkcr7EEw==
|
||||
-----END X509 CRL-----
|
11
src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0
Normal file
11
src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0
Normal file
@@ -0,0 +1,11 @@
|
||||
-----BEGIN X509 CRL-----
|
||||
MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ
|
||||
b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0xODEx
|
||||
MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBAhcNMTgxMTI3MTM0MDU1WjAN
|
||||
BgkqhkiG9w0BAQsFAAOCAQEAXjLxA9Qc6gAudwUHBxMIq5EHBcuNEX5e3GNlkyNf
|
||||
8I0DtHTPfJPvmAG+i6lYz//hHmmjxK0dR2ucg79XgXI/6OpDqlxS/TG1Xv52wA1p
|
||||
xz6GaJ2hC8Lk4/vbJo/Rrzme2QsI7xqBWya0JWVrehttqhFxPzWA5wID8X7G4Kb4
|
||||
pjVnzqYzn8A9FBiV9t10oZg60aVLqt3kbyy+U3pefvjhj8NmQc7uyuVjWvYZA0vG
|
||||
nnDUo4EKJzHNIYLk+EfpzKWO2XAWBLOT9SyyNCeMuQ5p/2pdAt9jtWHenms2ajo9
|
||||
2iUsHS91e3TooP9yNYuNcN8/wXY6H2Xm+dCLcEnkcr7EEw==
|
||||
-----END X509 CRL-----
|
11
src/test/ssl/ssl/root+client-crldir/a3d11bff.r0
Normal file
11
src/test/ssl/ssl/root+client-crldir/a3d11bff.r0
Normal file
@@ -0,0 +1,11 @@
|
||||
-----BEGIN X509 CRL-----
|
||||
MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm
|
||||
b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx
|
||||
MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a
|
||||
qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz
|
||||
4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5
|
||||
lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4
|
||||
pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E
|
||||
PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG
|
||||
AlO+O0a4SpYS
|
||||
-----END X509 CRL-----
|
11
src/test/ssl/ssl/root+server-crldir/a3d11bff.r0
Normal file
11
src/test/ssl/ssl/root+server-crldir/a3d11bff.r0
Normal file
@@ -0,0 +1,11 @@
|
||||
-----BEGIN X509 CRL-----
|
||||
MIIBhTBvMA0GCSqGSIb3DQEBCwUAMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBm
|
||||
b3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlFw0xODExMjcx
|
||||
MzQwNTVaFw00NjA0MTQxMzQwNTVaMA0GCSqGSIb3DQEBCwUAA4IBAQB8OSDym4/a
|
||||
qbZOrZvOOhmKrd7AJSTgAadtdK0CX3v58Ym3EmZK7gQFdBuFCXnvbue/x6avZHgz
|
||||
4pYFlJmL0IiD4QuTzsoo+LzifrmTzteO9oEJNLd2bjfEnpE5Wdaw6Yuy2Xb5edy5
|
||||
lQhNZdc8w3FiXhPOEUAi7EbdfDwn4G/fvEjpzyVb2wCujDUUePUGGayjKIM4PUu4
|
||||
pixM6gt9FFL27l47lQ3g0PbvB3TnU3oqcB3Y17FjbxjFc6AsGXholNetoEE2/49E
|
||||
PEYzOH7/PtxlZUtoCqZM+741LuI6Q7z4/P2X/IY33lMy6Iiyc41C94l/P7fCkMLG
|
||||
AlO+O0a4SpYS
|
||||
-----END X509 CRL-----
|
11
src/test/ssl/ssl/root+server-crldir/a836cc2d.r0
Normal file
11
src/test/ssl/ssl/root+server-crldir/a836cc2d.r0
Normal file
@@ -0,0 +1,11 @@
|
||||
-----BEGIN X509 CRL-----
|
||||
MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ
|
||||
b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0xODEx
|
||||
MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBBhcNMTgxMTI3MTM0MDU1WjAN
|
||||
BgkqhkiG9w0BAQsFAAOCAQEAbVuJXemxM6HLlIHGWlQvVmsmG4ZTQWiDnZjfmrND
|
||||
xB4XsvZNPXnFkjdBENDROrbDRwm60SJDW73AbDbfq1IXAzSpuEyuRz61IyYKo0wq
|
||||
nmObJtVdIu3bVlWIlDXaP5Emk3d7ouCj5f8Kyeb8gm4pL3N6e0eI63hCaS39hhE6
|
||||
RLGh9HU9ht1kKfgcTwmB5b2HTPb4M6z1AmSIaMVqZTjIspsUgNF2+GBm3fOnOaiZ
|
||||
SEXWtgjMRXiIHbtU0va3LhSH5OSW0mh+L9oGUQDYnyuudnWGpulhqIp4qVkJRDDu
|
||||
41HpD83dV2uRtBLvc25AFHj7kXBflbO3gvGZVPYf1zVghQ==
|
||||
-----END X509 CRL-----
|
11
src/test/ssl/ssl/server-crldir/a836cc2d.r0
Normal file
11
src/test/ssl/ssl/server-crldir/a836cc2d.r0
Normal file
@@ -0,0 +1,11 @@
|
||||
-----BEGIN X509 CRL-----
|
||||
MIIBnjCBhzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ
|
||||
b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0xODEx
|
||||
MjcxMzQwNTVaFw00NjA0MTQxMzQwNTVaMBQwEgIBBhcNMTgxMTI3MTM0MDU1WjAN
|
||||
BgkqhkiG9w0BAQsFAAOCAQEAbVuJXemxM6HLlIHGWlQvVmsmG4ZTQWiDnZjfmrND
|
||||
xB4XsvZNPXnFkjdBENDROrbDRwm60SJDW73AbDbfq1IXAzSpuEyuRz61IyYKo0wq
|
||||
nmObJtVdIu3bVlWIlDXaP5Emk3d7ouCj5f8Kyeb8gm4pL3N6e0eI63hCaS39hhE6
|
||||
RLGh9HU9ht1kKfgcTwmB5b2HTPb4M6z1AmSIaMVqZTjIspsUgNF2+GBm3fOnOaiZ
|
||||
SEXWtgjMRXiIHbtU0va3LhSH5OSW0mh+L9oGUQDYnyuudnWGpulhqIp4qVkJRDDu
|
||||
41HpD83dV2uRtBLvc25AFHj7kXBflbO3gvGZVPYf1zVghQ==
|
||||
-----END X509 CRL-----
|
@@ -17,7 +17,7 @@ if ($ENV{with_ssl} ne 'openssl')
|
||||
}
|
||||
else
|
||||
{
|
||||
plan tests => 93;
|
||||
plan tests => 100;
|
||||
}
|
||||
|
||||
#### Some configuration
|
||||
@@ -215,12 +215,25 @@ test_connect_fails(
|
||||
qr/SSL error/,
|
||||
"CRL belonging to a different CA");
|
||||
|
||||
# The same for CRL directory
|
||||
test_connect_fails(
|
||||
$common_connstr,
|
||||
"sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/client-crldir",
|
||||
qr/SSL error/,
|
||||
"directory CRL belonging to a different CA");
|
||||
|
||||
# With the correct CRL, succeeds (this cert is not revoked)
|
||||
test_connect_ok(
|
||||
$common_connstr,
|
||||
"sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrl=ssl/root+server.crl",
|
||||
"CRL with a non-revoked cert");
|
||||
|
||||
# The same for CRL directory
|
||||
test_connect_ok(
|
||||
$common_connstr,
|
||||
"sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/root+server-crldir",
|
||||
"directory CRL with a non-revoked cert");
|
||||
|
||||
# Check that connecting with verify-full fails, when the hostname doesn't
|
||||
# match the hostname in the server's certificate.
|
||||
$common_connstr =
|
||||
@@ -346,7 +359,12 @@ test_connect_fails(
|
||||
$common_connstr,
|
||||
"sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrl=ssl/root+server.crl",
|
||||
qr/SSL error/,
|
||||
"does not connect with client-side CRL");
|
||||
"does not connect with client-side CRL file");
|
||||
test_connect_fails(
|
||||
$common_connstr,
|
||||
"sslrootcert=ssl/root+server_ca.crt sslmode=verify-ca sslcrldir=ssl/root+server-crldir",
|
||||
qr/SSL error/,
|
||||
"does not connect with client-side CRL directory");
|
||||
|
||||
# pg_stat_ssl
|
||||
command_like(
|
||||
@@ -545,6 +563,16 @@ test_connect_ok(
|
||||
test_connect_fails($common_connstr, "sslmode=require sslcert=ssl/client.crt",
|
||||
qr/SSL error/, "intermediate client certificate is missing");
|
||||
|
||||
# test server-side CRL directory
|
||||
switch_server_cert($node, 'server-cn-only', undef, undef, 'root+client-crldir');
|
||||
|
||||
# revoked client cert
|
||||
test_connect_fails(
|
||||
$common_connstr,
|
||||
"user=ssltestuser sslcert=ssl/client-revoked.crt sslkey=ssl/client-revoked_tmp.key",
|
||||
qr/SSL error/,
|
||||
"certificate authorization fails with revoked client cert with server-side CRL directory");
|
||||
|
||||
# clean up
|
||||
foreach my $key (@keys)
|
||||
{
|
||||
|
@@ -150,6 +150,8 @@ sub configure_test_server_for_ssl
|
||||
copy_files("ssl/root+client_ca.crt", $pgdata);
|
||||
copy_files("ssl/root_ca.crt", $pgdata);
|
||||
copy_files("ssl/root+client.crl", $pgdata);
|
||||
mkdir("$pgdata/root+client-crldir");
|
||||
copy_files("ssl/root+client-crldir/*", "$pgdata/root+client-crldir/");
|
||||
|
||||
# Stop and restart server to load new listen_addresses.
|
||||
$node->restart;
|
||||
@@ -167,14 +169,24 @@ sub switch_server_cert
|
||||
my $node = $_[0];
|
||||
my $certfile = $_[1];
|
||||
my $cafile = $_[2] || "root+client_ca";
|
||||
my $crlfile = "root+client.crl";
|
||||
my $crldir;
|
||||
my $pgdata = $node->data_dir;
|
||||
|
||||
# defaults to use crl file
|
||||
if (defined $_[3] || defined $_[4])
|
||||
{
|
||||
$crlfile = $_[3];
|
||||
$crldir = $_[4];
|
||||
}
|
||||
|
||||
open my $sslconf, '>', "$pgdata/sslconfig.conf";
|
||||
print $sslconf "ssl=on\n";
|
||||
print $sslconf "ssl_ca_file='$cafile.crt'\n";
|
||||
print $sslconf "ssl_cert_file='$certfile.crt'\n";
|
||||
print $sslconf "ssl_key_file='$certfile.key'\n";
|
||||
print $sslconf "ssl_crl_file='root+client.crl'\n";
|
||||
print $sslconf "ssl_crl_file='$crlfile'\n" if defined $crlfile;
|
||||
print $sslconf "ssl_crl_dir='$crldir'\n" if defined $crldir;
|
||||
close $sslconf;
|
||||
|
||||
$node->restart;
|
||||
|
Reference in New Issue
Block a user