PostgreSQL SSL · 7 min read · Dec 21, 2025
Come abilitare SSL per le connessioni PostgreSQL

Per impostazione predefinita, tutte le connessioni PostgreSQL non sono sicure, il che può causare problemi di sicurezza quando vengono eseguite in ambienti di produzione ad alto traffico. La crittografia SSL garantisce che i dati trasferiti non vengano intercettati da nessuno nel mezzo di una connessione.
Questo tutorial ti insegnerà come abilitare SSL/TLS per le connessioni PostgreSQL.
Prerequisiti
- Un server Linux. Per il nostro tutorial, stiamo eseguendo un server Ubuntu 22.04.
- Un utente sudo non root.
- Un nome di dominio completamente qualificato (FQDN) come
postgresql.example.com. - Assicurati che tutto sia aggiornato.
$ sudo apt update $ sudo apt upgrade - Alcuni pacchetti di cui il tuo sistema ha bisogno.
$ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -yAlcuni di questi pacchetti potrebbero già essere installati sul tuo sistema.
Passo 1 - Configurare il Firewall
Prima di installare qualsiasi pacchetto, il primo passo è configurare il firewall per aprire le porte per HTTP, HTTPS e PostgreSQL.
Controlla lo stato del firewall.
$ sudo ufw status
Dovresti vedere qualcosa di simile al seguente.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apri le porte HTTP, HTTPS e PostgreSQL nel firewall.
$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https
Controlla di nuovo lo stato per confermare.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
5432 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
5432 (v6) ALLOW Anywhere (v6)
Passo 2 - Installare PostgreSQL 14
Ubuntu 22.04 include PostgreSQL 14 per impostazione predefinita. Per installarlo, emetti il seguente comando.
$ sudo apt install postgresql postgresql-contrib
Il pacchetto postgresql-contrib contiene alcune utilità extra.
Puoi anche utilizzare il repository APT ufficiale di PostgreSQL per installare. Esegui il seguente comando per aggiungere la chiave GPG di PostgreSQL.
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null
Aggiungi il repository APT alla tua lista di sorgenti.
$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
Aggiorna il repository di sistema.
$ sudo apt update
Ora puoi installare PostgreSQL utilizzando il comando menzionato sopra.
Controlla lo stato del servizio PostgreSQL.
$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
Main PID: 3497 (code=exited, status=0/SUCCESS)
CPU: 1ms
Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.
Puoi vedere che il servizio è abilitato e in esecuzione per impostazione predefinita.
Imposta la password per l’account postgres.
$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"
Passo 3 - Installare SSL
Per installare un certificato SSL utilizzando Let’s Encrypt, dobbiamo scaricare lo strumento Certbot. Utilizzeremo l’installer di pacchetti Snapd per questo. Ubuntu 22.04 viene fornito preinstallato con Snap.
Assicurati che la tua versione di Snapd sia aggiornata.
$ sudo snap install core
$ sudo snap refresh core
Installa Certbot.
$ sudo snap install --classic certbot
Usa il seguente comando per assicurarti che il comando Certbot venga eseguito creando un collegamento simbolico alla directory /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Genera un certificato SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com
Il comando sopra scaricherà un certificato nella directory /etc/letsencrypt/live/postgresql.example.com sul tuo server.
Genera un certificato Diffie-Hellman group.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Passo 4 - Configurare il rinnovo di Certbot per PostgreSQL
PostgreSQL non ha il permesso di accedere ai certificati dalla cartella di Let’s Encrypt, quindi non possiamo dirgli di utilizzare i certificati dalla cartella direttamente. L’alternativa è copiare i certificati nella directory di PostgreSQL, ma questo funziona solo temporaneamente poiché scadranno e dovrai copiarli di nuovo manualmente.
Il metodo migliore è utilizzare un hook di rinnovo che verrà eseguito automaticamente ad ogni rinnovo e eseguirà le operazioni di copia.
Cerca la directory dei dati di PostgreSQL.
$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'
Crea il file di hook di rinnovo e aprilo per la modifica.
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Incolla il seguente codice in esso.
#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# solo per SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Rendi il file eseguibile.
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
Passo 5 - Configurare PostgreSQL
Trova il percorso per il file di configurazione di PostgreSQL.
$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'
Apri il file per la modifica.
$ sudo nano /etc/postgresql/15/main/postgresql.conf
Trova la sezione Impostazioni di Connessione e decommenta la variabile listen_address e cambia il suo valore in *. Assicurati che appaia come segue.
listen_address = '*' # su quali indirizzi IP ascoltare;
Trova la sezione SSL e modifica il file per corrispondere ai seguenti valori.
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Passo 6 - Configurare la Connessione PostgreSQL
Apri il file /etc/postgresql/15/main/pg_hba.conf per la modifica.
$ sudo nano /etc/postgresql/15/main/pg_hba.conf
Aggiungi la seguente riga per abilitare SSL per PostgreSQL.
hostssl all all 0.0.0.0/0 scram-sha-256
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Passo 7 - Rinnova il Certificato
Esegui il seguente comando per eseguire un rinnovo forzato. Questo attiverà lo script di distribuzione che copia i certificati nella posizione corretta per l’utilizzo da parte di PostgreSQL.
$ sudo certbot renew --force-renewal
Verifica che i certificati siano copiati nella directory dei dati di PostgreSQL.
$ sudo ls /var/lib/postgresql/15/main/
Vedrai il seguente output che ti mostrerà i certificati.
base pg_dynshmem pg_notify pg_snapshots pg_subtrans PG_VERSION postgresql.auto.conf server.crt
global pg_logical pg_replslot pg_stat pg_tblspc pg_wal postmaster.opts server.key
pg_commit_ts pg_multixact pg_serial pg_stat_tmp pg_twophase pg_xact postmaster.pid
Riavvia PostgreSQL per applicare le modifiche.
$ sudo systemctl restart postgresql
Passo 8 - Testare la Connessione
Collegati al database da un’altra macchina con il client PostgreSQL installato.
$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres
Dovresti vedere il seguente prompt di PostgreSQL. Stiamo utilizzando un client con PostgreSQL 14, quindi vedrai un avviso riguardo a versioni incompatibili.
Password for user postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), server 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#
Questo conferma una connessione SSL riuscita.
Esci dalla shell.
postgres=# \q
Se la tua app utilizza una stringa di connessione, usala nel seguente formato per una connessione SSL.
postgres://user:[email protected]:5432/database_name?sslmode=require
Puoi cambiare la modalità SSL in verify-full o verify-ca se hai il certificato root per Let’s Encrypt disponibile nella posizione /var/lib/postgresql/.postgresql sul lato client.
Crea la directory /var/lib/postgresql/.postgresql.
$ sudo mkdir -p /var/lib/postgresql/.postgresql
Il certificato root di Let’s Encrypt è ISRG Root X1, che si trova sul server nella posizione /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.
Copia il certificato root nella directory /var/lib/postgresql/.postgresql.
$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt
Testa la connessione utilizzando la modalità verify-full o verify-ca e dovresti vedere una connessione riuscita.
Passo 9 - Controlla i Client
Accedi alla shell di PostgreSQL sul server.
$ sudo -i -u postgres psql
Esegui il seguente comando SQL per controllare i client connessi.
SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;
Dovresti vedere un output simile.
pid | usename | datname | ssl | version | cipher | bits | client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
5126 | postgres | postgres | t | TLSv1.3 | TLS_AES_256_GCM_SHA384 | 256 | 122.161.84.220
5154 | postgres | postgres | f | | | |
(2 rows)
Questo conferma la connessione del client dal lato server.
Conclusione
Questo conclude il tutorial su come abilitare SSL sulle connessioni PostgreSQL. Se hai domande, postale nei commenti qui sotto.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.