Error de 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

Primero la buena noticia: la ruta de red funciona y llegaste a PostgreSQL. Te rechazó porque ninguna línea de pg_hba.conf coincide con la combinación del mensaje: dirección del cliente, base de datos, usuario, y si la conexión usa SSL. El error te entrega las cuatro — la solución es escribir una regla que coincida con ellas.

Qué significa este error

pg_hba.conf se evalúa de arriba a abajo, gana la primera coincidencia — y una conexión que no coincide con ninguna línea obtiene este error. Cada línea coincide según el tipo de conexión (local, host, hostssl, hostnossl), base de datos, usuario y dirección del cliente, y luego nombra el método de autenticación a aplicar.

La cola del mensaje ("SSL encryption" / "no encryption") importa más de lo que parece: una línea hostssl nunca puede coincidir con un intento sin SSL, y viceversa. Si el mensaje dice "no encryption" y todas tus reglas dicen hostssl, la solución está en el cliente (sslmode=require), no en el archivo.

Causas comunes

Cómo diagnosticarlo

Toma los cuatro valores del mensaje de error y recorre las reglas con ellos:

-- La vista muestra las reglas tal como el servidor las leyó,
-- con posibles errores de parseo por línea:
SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules;

Comprueba, en orden: ¿hay una línea cuyo tipo de conexión coincida (¡SSL!)? ¿cuya lista de bases de datos incluya la tuya? ¿cuya lista de usuarios incluya el tuyo? ¿cuya dirección contenga la IP del cliente del mensaje?

Cómo solucionarlo

Añade una regla tan estrecha como la necesidad real, y luego recarga:

# /etc/postgresql/.../pg_hba.conf — ejemplo: app desde la subred privada, SSL, SCRAM
hostssl  appdb  app_user  10.0.0.0/24  scram-sha-256
SELECT pg_reload_conf();   -- o bien: systemctl reload postgresql
🔍 Un paso más adelante: password authentication failed — una regla coincidió, pero la comprobación de credenciales falló.