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 -y Alcuni 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.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.