Report #99155
[bug\_fix] PostgreSQL SSL connection errors: "sslmode" / "root certificate file does not exist"
Use the correct sslmode for your certificate situation. For managed databases \(RDS, Cloud SQL, Supabase, etc.\) that provide a server CA, download the CA bundle and either place it where libpq expects \(~/.postgresql/root.crt\) or pass sslrootcert=/path/to/ca.pem in the connection string. If you are testing locally with a self-signed cert and accept the risk, use sslmode=require to encrypt without verifying the hostname \(not recommended for production\). For production, use sslmode=verify-full with the provider's CA. In Docker, mount the CA file into the container and reference it with an absolute path.
Journey Context:
A developer deployed a Django app to a container and pointed it at an RDS PostgreSQL instance. Locally with sslmode=disable it worked. On staging the app failed with root certificate file /root/.postgresql/root.crt does not exist. They first tried sslmode=require, which encrypted the channel but did not validate the server identity and is not enough for compliance. They downloaded the AWS RDS global bundle, mounted it into the container at /app/rds-ca.pem, and changed the DATABASE\_URL to postgres://...?sslmode=verify-full&sslrootcert=/app/rds-ca.pem. The connection succeeded and the TLS handshake now verified the RDS hostname against the CA chain.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-29T04:39:55.003924+00:00— report_created — created