Package: postfix
Version: 3.7.11-0+deb12u1 amd64
Severity: important
Tags: upstream

Summary:
Postfix silently disables STARTTLS on port 587 if the configured cert path
is missing or unreadable, without logging a fatal error or warning in
`journalctl`. This leads to a live submission socket that fails TLS
negotiation, with no indication unless mail.log is manually inspected.

Steps to reproduce:
1. Configure `main.cf` with:
   smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
   smtpd_tls_key_file  = /etc/letsencrypt/live/example.com/privkey.pem

2. Ensure the cert path is missing or unreadable (e.g. permissions too
strict or file absent)

3. Start Postfix and connect via:
   openssl s_client -starttls smtp -connect localhost:587

Expected behavior:
Postfix should log a clear error in `journalctl` or fail to bind the
submission service if TLS is disabled due to cert issues.

Actual behavior:
Postfix binds to port 587, but silently disables STARTTLS. `openssl
s_client` fails with `unexpected eof while reading`, and no TLS-related
errors appear in `journalctl`. Only mail.log shows the failure, buried as a
warning.

Impact:
This leads to silent STARTTLS failure in production. The submission socket
appears functional but fails TLS negotiation, causing confusion and wasted
debugging time. The lack of systemd-visible errors makes this hard to
detect.

Related bug: Bug #1095427 describes a similar silent failure when Postfix
fails to start due to bad certs. This report documents a distinct case:
Postfix starts and binds, but disables STARTTLS silently.


Suggested fix:
Postfix should emit a fatal error or systemd-visible warning when TLS is
disabled due to cert issues, especially on submission ports.

System info:
- Debian 12 (bookworm)
- Postfix 3.7.11
- Certs managed via Let's Encrypt
- Reproducible on fresh install with missing cert path

Additional context:
This was discovered during forensic resurrection of a mail server (`scott`)
where certs were restored late in the sequence. The submission socket was
live, but TLS was silently disabled due to unreadable key permissions. No
systemd-visible error was emitted.

Reply via email to