PostgreSQL 18 TLS Configuration Changes: What Managed Database Teams Should Check
PostgreSQL 18 adds TLS 1.3 cipher configuration and changes elliptic-curve settings, which makes upgrade reviews a good time to document database transport security.
ArmorDB Engineering
ArmorDB engineering

On this page 6 sections
PostgreSQL 18 includes a small but useful set of TLS configuration changes that deserve a place in upgrade planning. The release notes add a new ssl_tls13_ciphers server parameter for TLS 1.3 cipher suites, change the default elliptic-curve group list to include X25519, and rename ssl_ecdh_curve to ssl_groups while allowing multiple colon-separated groups.
For most application teams, this is not a reason to hand-tune cryptography on day one. It is a reason to stop treating database TLS as a box that was checked years ago. Managed PostgreSQL still depends on client libraries, connection strings, poolers, certificates, and server settings working together. A major-version review is the right moment to verify those assumptions before an old client image or stale runbook turns a security improvement into an outage.
What changed in PostgreSQL 18
PostgreSQL already supported encrypted client connections when built with OpenSSL, along with settings such as ssl_min_protocol_version, ssl_max_protocol_version, ssl_ciphers, and certificate paths. PostgreSQL 18 adds a more explicit setting for TLS 1.3 cipher suites. The documentation describes ssl_tls13_ciphers as a colon-separated list of cipher suites allowed for connections using TLS 1.3, with OpenSSL defaults applying when the setting is left blank.
The release also modernizes elliptic-curve configuration. The old ssl_ecdh_curve name becomes ssl_groups, and the setting can now hold multiple colon-separated groups instead of a single curve. The release notes also say the default now includes X25519. In practical terms, PostgreSQL 18 gives operators a clearer way to express modern TLS preferences without forcing every deployment into one custom curve value.
| Change | What it controls | Why it matters | Upgrade action |
|---|---|---|---|
ssl_tls13_ciphers | Allowed TLS 1.3 cipher suites | TLS 1.3 uses a different cipher-suite model from older protocols | Leave defaults unless policy requires an allowlist, then test clients first |
ssl_groups | ECDH groups used during key exchange | Multiple supported groups reduce brittle single-curve assumptions | Replace old ssl_ecdh_curve references in config docs and automation |
| X25519 in the default group list | A widely used modern elliptic-curve group | Better compatibility with current TLS stacks | Check only if your organization pins an explicit group list |
ssl_min_protocol_version | Oldest accepted TLS protocol version | PostgreSQL defaults to TLSv1.2 as of the docs | Confirm legacy clients do not require older protocols |
Client sslmode | Whether clients verify encryption and identity | Server-side TLS is only half the path | Prefer verified modes for production connections |
The important nuance is that the new settings are not a universal tuning recipe. Cryptographic defaults are maintained by PostgreSQL and OpenSSL for a reason. Custom allowlists can be necessary in regulated environments, but they also create compatibility work for every application runtime, migration tool, admin container, and pooler that connects to the database.
Why managed PostgreSQL users should care
Managed databases reduce the amount of server administration you own, but they do not remove transport-security decisions from the application boundary. If an application connects with sslmode=disable, the server's TLS feature set is irrelevant for that connection. If it connects with encryption but no hostname or certificate verification, the application may still be protected from passive network observation while remaining weaker against endpoint confusion. If a pooler terminates or forwards TLS, the pooler becomes part of the security story.
This is why TLS reviews often fail as documentation problems rather than cipher problems. The database may be healthy, but nobody knows which service uses which connection string, which certificate bundle is baked into a container, or whether a background job uses a different driver from the web application. PostgreSQL 18's TLS changes are a useful trigger to inventory those paths.
On ArmorDB, keep ordinary connection setup documented through /docs/connect, and treat PgBouncer as part of the same review when applications connect through pooling. The pooler can make connection management easier, but it should not become an undocumented exception to production TLS policy.
A practical upgrade review
Start by separating server policy from client behavior. On the server side, record whether TLS is required, the minimum protocol version, and whether your provider exposes any custom cipher or group controls. On the client side, list every runtime that connects: web servers, workers, migration jobs, BI tools, admin scripts, CI tasks, and one-off import containers. For each, capture the driver family and how it sets sslmode or equivalent TLS options.
Then test the boring path before tuning the clever path. A staging database on PostgreSQL 18 should receive connections from the same app image, worker image, migration container, and admin tooling used in production. If all of those succeed with verified TLS, you have evidence that the upgrade is compatible. If a custom TLS 1.3 cipher list is required by policy, apply it in staging only after the baseline works, then test again. That order makes failures easier to interpret.
A useful smoke test is not only "can the app connect?" It should include a migration command, a background job, a PgBouncer path if used, and a backup or restore-related administrative path. TLS surprises often appear outside the main web request path because those tools run older images or use different connection libraries.
Common mistakes
The first mistake is copying an old ssl_ecdh_curve setting forward without reading the PostgreSQL 18 name change. The compatibility impact depends on how the provider or deployment handles old parameter names, but the operational fix is straightforward: update configuration templates and runbooks to use ssl_groups for PostgreSQL 18-era documentation.
The second mistake is assuming TLS 1.3 cipher tuning is automatically safer than defaults. A narrow allowlist that drops support for a client used by migrations or incident response can create availability risk without meaningful security gain. If your organization has a formal cipher policy, implement it deliberately. If it does not, the default OpenSSL-backed behavior is usually a better starting point than a hand-written list found in an old blog post.
The third mistake is forgetting hostname and certificate verification. Encryption protects the connection channel, but production systems also need confidence that they are talking to the intended database endpoint. Review client sslmode settings, certificate authority handling, and secret distribution together rather than treating them as separate chores.
Takeaway
PostgreSQL 18's TLS changes are not flashy, but they make transport-security configuration more explicit. The safest upgrade posture is simple: keep modern defaults unless policy says otherwise, replace old ssl_ecdh_curve references with ssl_groups, test every real client path against PostgreSQL 18, and document how applications verify encrypted connections. Managed PostgreSQL handles much of the server work, but connection security is still a shared boundary between the platform and the code that connects to it.
Sources / further reading
- PostgreSQL 18 release notes: https://www.postgresql.org/docs/18/release-18.html
- PostgreSQL 18 SSL server configuration: https://www.postgresql.org/docs/18/runtime-config-connection.html
- PostgreSQL libpq SSL support and
sslmode: https://www.postgresql.org/docs/18/libpq-ssl.html - PostgreSQL client authentication configuration: https://www.postgresql.org/docs/18/auth-pg-hba-conf.html
- ArmorDB connection documentation: /docs/connect
- ArmorDB PgBouncer documentation: /docs/pgbouncer
Written by ArmorDB Engineering
Practical notes on PostgreSQL operations, security, and infrastructure decisions for teams building production applications.
Updated Aug 9, 2026
Keep exploring
Related reading
News & Trends · 6 min read
PostgreSQL 18 Changes COPY CSV End-of-File Handling: What to Check Before Upgrading
PostgreSQL 18 no longer treats backslash-dot as a CSV end marker during server-side COPY FROM, which makes imports safer but exposes old client and script assumptions.
Read articleNews & Trends · 6 min read
PostgreSQL 18 MD5 Password Deprecation: How to Move to SCRAM
PostgreSQL 18 deprecates MD5-encrypted passwords; here is how to audit roles, move to SCRAM-SHA-256, and avoid surprise login failures.
Read articleNews & Trends · 7 min read
PostgreSQL 18 Enables Data Checksums by Default: What Changes in Production
PostgreSQL 18 enables data checksums by default for new clusters. Here is what that means for corruption detection, upgrades, managed PostgreSQL, and rollout planning.
Read article