mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Allow SSL configuration to be updated at SIGHUP.
It is no longer necessary to restart the server to enable, disable, or reconfigure SSL. Instead, we just create a new SSL_CTX struct (by re-reading all relevant files) whenever we get SIGHUP. Testing shows that this is fast enough that it shouldn't be a problem. In conjunction with that, downgrade the logic that complains about pg_hba.conf "hostssl" lines when SSL isn't active: now that's just a warning condition not an error. An issue that still needs to be addressed is what shall we do with passphrase-protected server keys? As this stands, the server would demand the passphrase again on every SIGHUP, which is certainly impractical. But the case was only barely supported before, so that does not seem a sufficient reason to hold up committing this patch. Andreas Karlsson, reviewed by Michael Banck and Michael Paquier Discussion: https://postgr.es/m/556A6E8A.9030400@proxel.se
This commit is contained in:
@ -70,7 +70,11 @@ sub configure_test_server_for_ssl
|
||||
|
||||
close CONF;
|
||||
|
||||
# Copy all server certificates and keys, and client root cert, to the data dir
|
||||
# ssl configuration will be placed here
|
||||
open SSLCONF, ">$pgdata/sslconfig.conf";
|
||||
close SSLCONF;
|
||||
|
||||
# Copy all server certificates and keys, and client root cert, to the data dir
|
||||
copy_files("ssl/server-*.crt", $pgdata);
|
||||
copy_files("ssl/server-*.key", $pgdata);
|
||||
chmod(0600, glob "$pgdata/server-*.key") or die $!;
|
||||
@ -78,10 +82,45 @@ sub configure_test_server_for_ssl
|
||||
copy_files("ssl/root_ca.crt", $pgdata);
|
||||
copy_files("ssl/root+client.crl", $pgdata);
|
||||
|
||||
# Only accept SSL connections from localhost. Our tests don't depend on this
|
||||
# but seems best to keep it as narrow as possible for security reasons.
|
||||
#
|
||||
# When connecting to certdb, also check the client certificate.
|
||||
# Stop and restart server to load new listen_addresses.
|
||||
$node->restart;
|
||||
|
||||
# Change pg_hba after restart because hostssl requires ssl=on
|
||||
configure_hba_for_ssl($node, $serverhost);
|
||||
}
|
||||
|
||||
# Change the configuration to use given server cert file, and reload
|
||||
# the server so that the configuration takes effect.
|
||||
sub switch_server_cert
|
||||
{
|
||||
my $node = $_[0];
|
||||
my $certfile = $_[1];
|
||||
my $cafile = $_[2] || "root+client_ca";
|
||||
my $pgdata = $node->data_dir;
|
||||
|
||||
diag "Reloading server with certfile \"$certfile\" and cafile \"$cafile\"...";
|
||||
|
||||
open 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";
|
||||
close SSLCONF;
|
||||
|
||||
$node->reload;
|
||||
}
|
||||
|
||||
sub configure_hba_for_ssl
|
||||
{
|
||||
my $node = $_[0];
|
||||
my $serverhost = $_[1];
|
||||
my $pgdata = $node->data_dir;
|
||||
|
||||
# Only accept SSL connections from localhost. Our tests don't depend on this
|
||||
# but seems best to keep it as narrow as possible for security reasons.
|
||||
#
|
||||
# When connecting to certdb, also check the client certificate.
|
||||
open HBA, ">$pgdata/pg_hba.conf";
|
||||
print HBA
|
||||
"# TYPE DATABASE USER ADDRESS METHOD\n";
|
||||
@ -95,26 +134,3 @@ sub configure_test_server_for_ssl
|
||||
"hostssl certdb ssltestuser ::1/128 cert\n";
|
||||
close HBA;
|
||||
}
|
||||
|
||||
# Change the configuration to use given server cert file, and restart
|
||||
# the server so that the configuration takes effect.
|
||||
sub switch_server_cert
|
||||
{
|
||||
my $node = $_[0];
|
||||
my $certfile = $_[1];
|
||||
my $cafile = $_[2] || "root+client_ca";
|
||||
my $pgdata = $node->data_dir;
|
||||
|
||||
diag "Restarting server with certfile \"$certfile\" and cafile \"$cafile\"...";
|
||||
|
||||
open 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";
|
||||
close SSLCONF;
|
||||
|
||||
# Stop and restart server to reload the new config.
|
||||
$node->restart;
|
||||
}
|
||||
|
Reference in New Issue
Block a user