Errore PostgreSQL: no pg_hba.conf entry for host

FATAL:  no pg_hba.conf entry for host "10.0.0.23", user "app_user", database "appdb", SSL encryption

Prima la buona notizia: il percorso di rete funziona e hai raggiunto PostgreSQL. Ti ha rifiutato perché nessuna riga in pg_hba.conf corrisponde alla combinazione nel messaggio: indirizzo client, database, user, e se la connessione usa SSL. L'errore ti fornisce tutti e quattro — la soluzione è scrivere una regola che li faccia corrispondere.

Cosa significa questo errore

pg_hba.conf è valutato dall'alto verso il basso, vince la prima corrispondenza — e una connessione che non corrisponde a nessuna riga riceve questo errore. Ogni riga corrisponde per tipo di connessione (local, host, hostssl, hostnossl), database, user e indirizzo del client, poi indica il metodo di autenticazione da applicare.

La coda del messaggio ("SSL encryption" / "no encryption") conta più di quanto sembri: una riga hostssl non può mai corrispondere a un tentativo non-SSL, e viceversa. Se il messaggio dice "no encryption" e tutte le tue regole dicono hostssl, la soluzione è sul client (sslmode=require), non nel file.

Cause comuni

Come diagnosticarlo

Prendi i quattro valori dal messaggio di errore e percorri le regole con essi:

-- La vista mostra le regole così come il server le ha lette,
-- con eventuali errori di parsing per riga:
SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules;

Controlla, in ordine: c'è una riga il cui tipo di connessione corrisponde (SSL!)? la cui lista di database include il tuo? la cui lista di utenti include il tuo? il cui indirizzo contiene l'IP del client nel messaggio?

Come risolverlo

Aggiungi una regola stretta quanto il bisogno reale, poi ricarica:

# /etc/postgresql/.../pg_hba.conf — esempio: app dal subnet privato, SSL, SCRAM
hostssl  appdb  app_user  10.0.0.0/24  scram-sha-256
SELECT pg_reload_conf();   -- oppure: systemctl reload postgresql
🔍 Un passo oltre: password authentication failed — una regola ha corrisposto, ma il controllo delle credenziali è fallito.