Configuring PostgreSQL to use SSL involves setting up certificates on the server, configuring PostgreSQL to use these certificates, and then configuring the client to connect securely. This ensures that data transmitted between the PostgreSQL server and client is encrypted, enhancing security, especially over unsecured networks. Here’s a step-by-step guide on how to configure SSL for both PostgreSQL server and client efficiently:
Generate SSL Certificates
First, you need to create a Certificate Authority (CA) and use it to generate SSL certificates for the server. You can use OpenSSL for this purpose. The following commands create a simple self-signed certificate and key for your server, but in a production environment, you might want to get a certificate signed by an external CA.
Generate a private key for the CA:
openssl genpkey -algorithm RSA -out root.key
Create a self-signed root certificate:
openssl req -new -x509 -days 365 -key root.key -out root.crt -subj "/C=US/ST=New York/L=Brooklyn/O=Example Company/CN=example.com"
Generate a private key for the server:
openssl genpkey -algorithm RSA -out server.key
Create a certificate signing request (CSR) for the server:
openssl req -new -key server.key -out server.csr -subj "/C=US/ST=New York/L=Brooklyn/O=Example Company/CN=example.com"
Sign the server's CSR with the CA's private key to get the server's certificate:
openssl x509 -req -in server.csr -CA root.crt -CAkey root.key -CAcreateserial -out server.crt -days 365
Ensure server.crt
, server.key
, and the CA's certificate root.crt
are moved to the PostgreSQL data directory (commonly /var/lib/postgresql/data
on Linux) and ensure the server has read access to these files.
Configure PostgreSQL to Use SSL
Edit the postgresql.conf
file located in your PostgreSQL data directory to enable SSL:
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'
This tells PostgreSQL to use SSL and points it to the correct certificate and key files.
Restart PostgreSQL Server
Apply the changes by restarting the PostgreSQL service:
systemctl restart postgresql
or, if you're not using systemd:
pg_ctl restart
Configure the Client to Use SSL
Clients need to trust the CA that issued the server's certificate. This often involves adding the CA's certificate (root.crt
) to the client's certificate store or specifying it in the connection string or configuration.
For psql
, you can use the following environment variables:
export PGSSLMODE=verify-full
export PGSSLROOTCERT=path/to/root.crt
Alternatively, specify SSL options in the connection string:
psql "sslmode=verify-full sslrootcert=path/to/root.crt host=example.com dbname=mydb user=myuser"
By following these steps, you can configure PostgreSQL and its clients to use SSL, improving the security of your data in transit. Always test your SSL configuration in a development environment before deploying it to production to ensure everything works as expected.