ArmorDB Logo
ArmorDB
All articles
News & TrendsAugust 9, 20267 min read

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

PostgreSQL 18TLSSecurity
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.

ChangeWhat it controlsWhy it mattersUpgrade action
ssl_tls13_ciphersAllowed TLS 1.3 cipher suitesTLS 1.3 uses a different cipher-suite model from older protocolsLeave defaults unless policy requires an allowlist, then test clients first
ssl_groupsECDH groups used during key exchangeMultiple supported groups reduce brittle single-curve assumptionsReplace old ssl_ecdh_curve references in config docs and automation
X25519 in the default group listA widely used modern elliptic-curve groupBetter compatibility with current TLS stacksCheck only if your organization pins an explicit group list
ssl_min_protocol_versionOldest accepted TLS protocol versionPostgreSQL defaults to TLSv1.2 as of the docsConfirm legacy clients do not require older protocols
Client sslmodeWhether clients verify encryption and identityServer-side TLS is only half the pathPrefer 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

Written by ArmorDB Engineering

Practical notes on PostgreSQL operations, security, and infrastructure decisions for teams building production applications.

Updated Aug 9, 2026