Direct topology: built-in ACME
When OxiMail owns ports 80/443, it provisions and renews its own certificate from Let’s Encrypt:ArcSwap, ADR-016): in-flight connections finish on the old one, new handshakes get the new one, on every listener at once — including SMTP and IMAP.
Reverse-proxy topology
Behind Caddy or Nginx, the proxy owns 80/443 and its own certificates, andacme_enabled = false (the wizard writes this for you). Two things still matter:
- SMTP (25/587/465) and IMAPS (993) are not proxied — OxiMail terminates TLS on those itself. It needs a certificate for them: point
[tls]at the proxy’s certificate files or run a deploy hook that copies them, and remember OxiMail hot-reloads the files when they change. - The proxy must forward everything except the ACME challenge path, with
X-Forwarded-Forfrom a[server] trusted_proxiesaddress — see first boot for the generated snippet and the CORS rule.
The DANE coupling
If you publish DANE TLSA records (email authentication), a certificate renewal changes the pinned value — stale TLSA records break inbound mail from every DANE-validating sender. This is whydane_enabled = true (the default) requires a configured [dns] provider: after each renewal, OxiMail republishes the TLSA records itself (Cloudflare API), or logs a loud reminder in manual mode. A server with DANE on and no DNS provider refuses to start rather than setting you up for that silent breakage.
Post-quantum key exchange
Every TLS surface OxiMail terminates itself — 25, 465, 587, 993, and 443 when no frontend sits in front of it — offers the hybrid group X25519MLKEM768 first, with classic X25519 as the fallback. Nothing is broken by this: a peer that does not know the hybrid group negotiates X25519 exactly as it did before. There is no setting to turn it on; it is the shipped posture. The threat it addresses is “harvest now, decrypt later” — an adversary recording today’s traffic to decrypt it when the machine to do so exists. Being late to this is not recoverable after the fact, which is why it is a default rather than an option. It is not theoretical for mail either: Gmail already offers the hybrid group on 25, 465, 587 and 993, so outbound mail to it negotiates post-quantum today. Verify rather than assume. This exact property was silently false here for months: the feature was compiled in while the installed crypto provider had no implementation for it, so every session fell back to classic X25519 while the configuration read as if it did not. A fallback of this kind is invisible — no error, no log line, nothing failing. With OpenSSL 3.5 or later:Inspecting and troubleshooting
- Port 80 unreachable — the HTTP-01 challenge cannot complete. Open it in the firewall/security group; it only ever serves challenges and redirects.
- Rate-limited by Let’s Encrypt — repeated failed issuance attempts (usually a DNS mistake) can hit LE’s per-domain limits; fix the cause before retrying in a loop.
- DANE senders bouncing after a renewal — the TLSA records were not updated. Check the
[dns]provider configuration and the renewal logs.
/etc/oximail/tls/, which is part of the standard backup surface.