TLSPROXY(8)

๐Ÿ“ฆ
version 3.11.7 ยท 4 versions
, in alpine 3.22, alpine 3.23, alpine 3.24, arch rolling, debian trixie, fedora 43, fedora 44, nixos 26.05, nixpkgs unstable, opensuse-leap 16.0, ubuntu questing, ubuntu resolute, ubuntu stonking

๐Ÿ’– TLSPROXY โ€” the Postfix TLS proxy bestie ๐Ÿ’–

ok so real talk, the manual name is tlsproxy(8) and it lives in the System Manager's Manual section, iykyk ๐ŸŽ€


โœจ NAME โœจ

tlsproxy โ€” the Postfix TLS proxy, no cap ๐Ÿ’…


๐ŸŒธ SYNOPSIS ๐ŸŒธ

tlsproxy [generic Postfix daemon options]

๐Ÿฆ‹ DESCRIPTION ๐Ÿฆ‹

ok bestie, listen. The tlsproxy(8) server is a two-way TLS proxy. It's got two whole jobs and it's serving both of them flawlessly ๐Ÿ’…

  • The postscreen(8) server uses it to talk SMTP-over-TLS with remote SMTP clients that are not allowlisted โ€” and yes that includes the clients whose allowlist status has expired, they're still getting proxied, periodt.
  • The smtp(8) client uses it to support TLS connection reuse.

But lowkey? It should also work for non-SMTP protocols. It's flexible like that, main character energy fr fr โœจ

So like, one single tlsproxy(8) process can serve multiple sessions at the same time, but ngl it's genuinely a good idea to let the number of processes increase with load so the service stays responsive. Don't be stingy with the processes bestie ๐Ÿซถ


๐Ÿ”ฅ PROTOCOL EXAMPLE ๐Ÿ”ฅ

The example below is all about postscreen(8). BUT โ€” and this is the important part โ€” the tlsproxy(8) server is agnostic of the application protocol, so you can easily adapt this example to other applications too. It's not a postscreen-only situation, it's giving versatile ๐Ÿ‘‘

So here's the whole flow:

  1. After receiving a valid remote SMTP client STARTTLS command, the postscreen(8) server sends the remote SMTP client endpoint string, the requested role (server), and the requested timeout to tlsproxy(8).
  2. Then postscreen(8) receives a "TLS available" indication from tlsproxy(8).
  3. If the TLS service is available, postscreen(8) sends the remote SMTP client file descriptor to tlsproxy(8), and sends the plaintext 220 greeting to the remote SMTP client.
  4. This triggers TLS negotiations between the remote SMTP client and tlsproxy(8).
  5. Upon completion of the TLS-level handshake, tlsproxy(8) translates between plaintext from/to postscreen(8) and ciphertext to/from the remote SMTP client.

That's it. That's the whole glow-up. Obsessed ๐Ÿ˜ญ๐Ÿ’–


๐ŸŽ€ SECURITY ๐ŸŽ€

The tlsproxy(8) server is moderately security-sensitive. It talks to untrusted clients on the network, so like, keep that in mind bestie ๐Ÿ™ˆ

The good news: the process can be run chrooted at fixed low privilege. Slay ๐Ÿซถ


๐Ÿ’€ DIAGNOSTICS ๐Ÿ’€

Problems and transactions are logged to syslogd(8) or postlogd(8). So if something's weird, go check the logs, that's where the drama gets written down โœจ


๐Ÿ‘‘ CONFIGURATION PARAMETERS ๐Ÿ‘‘

ok so important: changes to main.cf are not picked up automatically, because tlsproxy(8) processes may run for a long time depending on mail server load. So if you want your change to actually happen fast, run this:

postfix reload

The text below is only a parameter summary. For more details including examples, go read postconf(5). That's where the full lore lives ๐Ÿ“š


๐ŸŒˆ STARTTLS GLOBAL CONTROLS ๐ŸŒˆ

these settings are global which means they literally cannot be overruled by information specified in a tlsproxy(8) client request. Not up for negotiation, bestie, that's just how it is ๐Ÿ’…

  • tls_append_default_CA (no) โ€” Append the system-supplied default Certification Authority certificates to the ones specified with *_tls_CApath or *_tls_CAfile.
  • tls_daemon_random_bytes (32) โ€” The number of pseudo-random bytes that an smtp(8) or smtpd(8) process requests from the tlsmgr(8) server in order to seed its internal pseudo random number generator (PRNG).
  • tls_high_cipherlist (see postconf -d output) โ€” The OpenSSL cipherlist for "high" grade ciphers.
  • tls_medium_cipherlist (see postconf -d output) โ€” The OpenSSL cipherlist for "medium" or higher grade ciphers.
  • tls_null_cipherlist (eNULL:!aNULL) โ€” The OpenSSL cipherlist for "NULL" grade ciphers that provide authentication without encryption. (yes, auth with no encryption, that's the whole point of this one ๐Ÿซฃ)
  • tls_eecdh_strong_curve (prime256v1) โ€” The elliptic curve used by the Postfix SMTP server for sensibly strong ephemeral ECDH key exchange.
  • tls_eecdh_ultra_curve (secp384r1) โ€” The elliptic curve used by the Postfix SMTP server for maximally strong ephemeral ECDH key exchange.
  • tls_disable_workarounds (see postconf -d output) โ€” List or bit-mask of OpenSSL bug work-arounds to disable.
  • tls_preempt_cipherlist (no) โ€” With SSLv3 and later, use the Postfix SMTP server's cipher preference order instead of the remote client's cipher preference order.

Available in Postfix version 2.8..3.7: โœจ

  • tls_low_cipherlist (see postconf -d output) โ€” The OpenSSL cipherlist for "low" or higher grade ciphers.
  • tls_export_cipherlist (see postconf -d output) โ€” The OpenSSL cipherlist for "export" or higher grade ciphers.

Available in Postfix version 2.9 and later: โœจ

  • tls_legacy_public_key_fingerprints (no) โ€” A temporary migration aid for sites that use certificate public-key fingerprints with Postfix 2.9.0..2.9.5, which use an incorrect algorithm. (temporary aid, bestie, don't get attached ๐Ÿฅฒ)

Available in Postfix version 2.11-3.1: โœจ

  • tls_dane_digest_agility (on) โ€” Configure RFC7671 DANE TLSA digest algorithm agility.
  • tls_dane_trust_anchor_digest_enable (yes) โ€” Enable support for RFC 6698 (DANE TLSA) DNS records that contain digests of trust-anchors with certificate usage "2".

Available in Postfix version 2.11 and later: โœจ

  • tlsmgr_service_name (tlsmgr) โ€” The name of the tlsmgr(8) service entry in master.cf.

Available in Postfix version 3.0 and later: โœจ

  • tls_session_ticket_cipher (Postfix >= 3.0: aes-256-cbc, Postfix < 3.0: aes-128-cbc) โ€” Algorithm used to encrypt RFC5077 TLS session tickets.
  • openssl_path (openssl) โ€” The location of the OpenSSL command line program openssl(1).

Available in Postfix version 3.2 and later: โœจ

  • tls_eecdh_auto_curves (see postconf -d output) โ€” The prioritized list of elliptic curves, that should be enabled in the Postfix SMTP client and server.

Available in Postfix version 3.4 and later: โœจ

  • tls_server_sni_maps (empty) โ€” Optional lookup tables that map names received from remote SMTP clients via the TLS Server Name Indication (SNI) extension to the appropriate keys and certificate chains.

Available in Postfix 3.5, 3.4.6, 3.3.5, 3.2.10, 3.1.13 and later: โœจ

  • tls_fast_shutdown_enable (yes) โ€” A workaround for implementations that hang Postfix while shutting down a TLS session, until Postfix times out. (a whole workaround for someone else's drama ๐Ÿ˜ญ)

Available in Postfix version 3.8 and later: โœจ

  • tls_ffdhe_auto_groups (see postconf -d output) โ€” The prioritized list of finite-field Diffie-Hellman ephemeral (FFDHE) key exchange groups supported by the Postfix SMTP client and server.

Available in Postfix 3.9, 3.8.1, 3.7.6, 3.6.10, 3.5.20 and later: โœจ

  • tls_config_file (default) โ€” Optional configuration file with baseline OpenSSL settings.
  • tls_config_name (empty) โ€” The application name passed by Postfix to OpenSSL library initialization functions.

โœจ STARTTLS SERVER CONTROLS โœจ

okay so these settings are literal clones of the Postfix SMTP server settings ๐Ÿ’ซ They let tlsproxy(8) load the same certificate and private key info as the Postfix SMTP server does, before it drops privileges โ€” so those key files can stay read-only for root and nobody else gets to peek at them ๐Ÿ” lowkey a whole security glow-up.

real talk though: these settings can currently not be overruled by anything in a tlsproxy(8) client request. That limitation might get removed in a future version, but for now? that's the vibe. ๐Ÿ’…
  • tlsproxy_tls_CAfile ($smtpd_tls_CAfile) โ€” a file holding (PEM format) CA certificates of the root CAs you trust to sign either remote SMTP client certificates or intermediate CA certificates ๐ŸŽ€
  • tlsproxy_tls_CApath ($smtpd_tls_CApath) โ€” a directory holding (PEM format) CA certificates of root CAs trusted to sign either remote SMTP client certificates or intermediate CA certificates ๐Ÿฆ‹
  • tlsproxy_tls_always_issue_session_ids ($smtpd_tls_always_issue_session_ids) โ€” force the Postfix tlsproxy(8) server to issue a TLS session id, even when TLS session caching is turned off. yes, even then. periodt โœจ
  • tlsproxy_tls_ask_ccert ($smtpd_tls_ask_ccert) โ€” ask a remote SMTP client for a client certificate ๐Ÿ™‹โ€โ™€๏ธ
  • tlsproxy_tls_ccert_verifydepth ($smtpd_tls_ccert_verifydepth) โ€” the verification depth for remote SMTP client certificates ๐ŸŒธ
  • tlsproxy_tls_cert_file ($smtpd_tls_cert_file) โ€” file with the Postfix tlsproxy(8) server RSA certificate in PEM format ๐Ÿ“œ
  • tlsproxy_tls_ciphers ($smtpd_tls_ciphers) โ€” the minimum TLS cipher grade that the Postfix tlsproxy(8) server will use with opportunistic TLS encryption ๐Ÿ”’
  • tlsproxy_tls_dcert_file ($smtpd_tls_dcert_file) โ€” file with the Postfix tlsproxy(8) server DSA certificate in PEM format
  • tlsproxy_tls_dh1024_param_file ($smtpd_tls_dh1024_param_file) โ€” file with DH parameters that the Postfix tlsproxy(8) server should use with non-export EDH ciphers ๐Ÿงฎ
  • tlsproxy_tls_dh512_param_file ($smtpd_tls_dh512_param_file) โ€” file with DH parameters that the Postfix tlsproxy(8) server should use with export-grade EDH ciphers
  • tlsproxy_tls_dkey_file ($smtpd_tls_dkey_file) โ€” file with the Postfix tlsproxy(8) server DSA private key in PEM format ๐Ÿ”‘
  • tlsproxy_tls_eccert_file ($smtpd_tls_eccert_file) โ€” file with the Postfix tlsproxy(8) server ECDSA certificate in PEM format
  • tlsproxy_tls_eckey_file ($smtpd_tls_eckey_file) โ€” file with the Postfix tlsproxy(8) server ECDSA private key in PEM format
  • tlsproxy_tls_eecdh_grade ($smtpd_tls_eecdh_grade) โ€” the Postfix tlsproxy(8) server security grade for ephemeral elliptic-curve Diffie-Hellman (EECDH) key exchange ๐ŸŒˆ
  • tlsproxy_tls_exclude_ciphers ($smtpd_tls_exclude_ciphers) โ€” list of ciphers or cipher types to exclude from the tlsproxy(8) server cipher list at all TLS security levels ๐Ÿšซ
  • tlsproxy_tls_fingerprint_digest ($smtpd_tls_fingerprint_digest) โ€” the message digest algorithm used to construct remote SMTP client-certificate fingerprints ๐Ÿซ†
  • tlsproxy_tls_key_file ($smtpd_tls_key_file) โ€” file with the Postfix tlsproxy(8) server RSA private key in PEM format
  • tlsproxy_tls_loglevel ($smtpd_tls_loglevel) โ€” enable additional Postfix tlsproxy(8) server logging of TLS activity ๐Ÿ“
  • tlsproxy_tls_mandatory_ciphers ($smtpd_tls_mandatory_ciphers) โ€” the minimum TLS cipher grade that the Postfix tlsproxy(8) server will use with mandatory TLS encryption
  • tlsproxy_tls_mandatory_exclude_ciphers ($smtpd_tls_mandatory_exclude_ciphers) โ€” additional list of ciphers or cipher types to exclude from the tlsproxy(8) server cipher list at mandatory TLS security levels
  • tlsproxy_tls_mandatory_protocols ($smtpd_tls_mandatory_protocols) โ€” the SSL/TLS protocols accepted by the Postfix tlsproxy(8) server with mandatory TLS encryption
  • tlsproxy_tls_protocols ($smtpd_tls_protocols) โ€” list of TLS protocols that the Postfix tlsproxy(8) server will exclude or include with opportunistic TLS encryption
  • tlsproxy_tls_req_ccert ($smtpd_tls_req_ccert) โ€” with mandatory TLS encryption, require a trusted remote SMTP client certificate in order to allow TLS connections to proceed โœ…
  • tlsproxy_tls_security_level ($smtpd_tls_security_level) โ€” the SMTP TLS security level for the Postfix tlsproxy(8) server; when a non-empty value is specified, this overrides the obsolete parameters smtpd_use_tls and smtpd_enforce_tls ๐Ÿ‘‘
  • tlsproxy_tls_chain_files ($smtpd_tls_chain_files) โ€” files with the Postfix tlsproxy(8) server keys and certificate chains in PEM format โ›“๏ธ

available in Postfix version 3.9 and later:

  • tlsproxy_tls_enable_rpk ($smtpd_tls_enable_rpk) โ€” request that remote SMTP clients send an RFC7250 raw public key instead of an X.509 certificate, when asking or requiring client authentication ๐Ÿ”

๐Ÿฆ‹ STARTTLS CLIENT CONTROLS ๐Ÿฆ‹

these ones are clones of the Postfix SMTP client settings โœจ they let tlsproxy(8) load the same certificate and private key info as the Postfix SMTP client, before dropping privileges, so the key files can stay read-only for root. and unlike the server ones, some of these settings may be overruled by info in a tlsproxy(8) client request ๐Ÿ‘€

available in Postfix version 3.4 and later:

  • tlsproxy_client_CAfile ($smtp_tls_CAfile) โ€” a file containing CA certificates of root CAs trusted to sign either remote TLS server certificates or intermediate CA certificates ๐ŸŽ€
  • tlsproxy_client_CApath ($smtp_tls_CApath) โ€” directory with PEM format Certification Authority certificates that the Postfix tlsproxy(8) client uses to verify a remote TLS server certificate
  • tlsproxy_client_chain_files ($smtp_tls_chain_files) โ€” files with the Postfix tlsproxy(8) client keys and certificate chains in PEM format โ›“๏ธ
  • tlsproxy_client_cert_file ($smtp_tls_cert_file) โ€” file with the Postfix tlsproxy(8) client RSA certificate in PEM format
  • tlsproxy_client_key_file ($smtp_tls_key_file) โ€” file with the Postfix tlsproxy(8) client RSA private key in PEM format ๐Ÿ”‘
  • tlsproxy_client_dcert_file ($smtp_tls_dcert_file) โ€” file with the Postfix tlsproxy(8) client DSA certificate in PEM format
  • tlsproxy_client_dkey_file ($smtp_tls_dkey_file) โ€” file with the Postfix tlsproxy(8) client DSA private key in PEM format
  • tlsproxy_client_eccert_file ($smtp_tls_eccert_file) โ€” file with the Postfix tlsproxy(8) client ECDSA certificate in PEM format
  • tlsproxy_client_eckey_file ($smtp_tls_eckey_file) โ€” file with the Postfix tlsproxy(8) client ECDSA private key in PEM format
  • tlsproxy_client_fingerprint_digest ($smtp_tls_fingerprint_digest) โ€” the message digest algorithm used to construct remote TLS server certificate fingerprints ๐Ÿซ†
  • tlsproxy_client_loglevel ($smtp_tls_loglevel) โ€” enable additional Postfix tlsproxy(8) client logging of TLS activity ๐Ÿ“
  • tlsproxy_client_loglevel_parameter (smtp_tls_loglevel) โ€” the name of the parameter that provides the tlsproxy_client_loglevel value ๐Ÿท๏ธ
  • tlsproxy_client_scert_verifydepth ($smtp_tls_scert_verifydepth) โ€” the verification depth for remote TLS server certificates
  • tlsproxy_client_use_tls ($smtp_use_tls) โ€” opportunistic mode: use TLS when a remote server announces TLS support ๐ŸŒˆ
  • tlsproxy_client_enforce_tls ($smtp_enforce_tls) โ€” enforcement mode: require that SMTP servers use TLS encryption ๐Ÿ”’
  • tlsproxy_client_per_site ($smtp_tls_per_site) โ€” optional lookup tables with the Postfix tlsproxy(8) client TLS usage policy by next-hop destination and by remote TLS server hostname ๐Ÿ—บ๏ธ

available in Postfix version 3.4-3.6:

  • tlsproxy_client_level ($smtp_tls_security_level) โ€” the default TLS security level for the Postfix tlsproxy(8) client ๐Ÿ‘‘
  • tlsproxy_client_policy ($smtp_tls_policy_maps) โ€” optional lookup tables with the Postfix tlsproxy(8) client TLS security policy by next-hop destination

available in Postfix version 3.7 and later:

  • tlsproxy_client_security_level ($smtp_tls_security_level) โ€” the default TLS security level for the Postfix tlsproxy(8) client ๐Ÿ‘‘
  • tlsproxy_client_policy_maps ($smtp_tls_policy_maps) โ€” optional lookup tables with the Postfix tlsproxy(8) client TLS security policy by next-hop destination

๐Ÿ’€ OBSOLETE STARTTLS SUPPORT CONTROLS ๐Ÿ’€

ngl these parameters are only here for compatibility with smtpd(8) legacy parameters. they're giving vintage, and not in the cute way ๐Ÿซ 

  • tlsproxy_use_tls ($smtpd_use_tls) โ€” opportunistic TLS: announce STARTTLS support to remote SMTP clients, but do not require that clients use TLS encryption
  • tlsproxy_enforce_tls ($smtpd_enforce_tls) โ€” mandatory TLS: announce STARTTLS support to remote SMTP clients, and require that clients use TLS encryption ๐Ÿ”’
  • tlsproxy_client_use_tls ($smtp_use_tls) โ€” opportunistic mode: use TLS when a remote server announces TLS support
  • tlsproxy_client_enforce_tls ($smtp_enforce_tls) โ€” enforcement mode: require that SMTP servers use TLS encryption

๐ŸŽ€ RESOURCE CONTROLS ๐ŸŽ€

  • tlsproxy_watchdog_timeout (10s) โ€” how much time a tlsproxy(8) process may take to process local or remote I/O before it is terminated by a built-in watchdog timer โฐ the vibes expire, bestie.

๐ŸŒธ MISCELLANEOUS CONTROLS ๐ŸŒธ

  • config_directory (see postconf -d output) โ€” the default location of the Postfix main.cf and master.cf configuration files ๐Ÿ“
  • process_id (read-only) โ€” the process ID of a Postfix command or daemon process ๐Ÿ”ข
  • process_name (read-only) โ€” the process name of a Postfix command or daemon process ๐Ÿท๏ธ
  • syslog_facility (mail) โ€” the syslog facility of Postfix logging ๐Ÿ“ฎ
  • syslog_name (see postconf -d output) โ€” a prefix that is prepended to the process name in syslog records, so that, for example, "smtpd" becomes "prefix/smtpd" โœจ

available in Postfix 3.3 and later:

  • service_name (read-only) โ€” the master.cf service name of a Postfix daemon process ๐Ÿ‘‘

๐Ÿ”ฅ SEE ALSO ๐Ÿ”ฅ


๐Ÿ’– LICENSE ๐Ÿ’–

The Secure Mailer license must be distributed with this software. no exceptions bestie, it's literally the rules ๐Ÿ“œโœจ


๐ŸŒˆ HISTORY ๐ŸŒˆ

This service was introduced with Postfix version 2.8. an icon from day one, fr fr ๐Ÿ’…


๐Ÿ‘‘ AUTHOR(S) ๐Ÿ‘‘

Wietse Venema IBM T.J. Watson Research P.O. Box 704 Yorktown Heights, NY 10598, USA

Wietse Venema Google, Inc. 111 8th Avenue New York, NY 10011, USA


and that's the whole page babes ๐Ÿซถ this was TLSPROXY(8) from the Postfix source, dated like the original manpage footer says โ€” go forth and proxy your TLS, you absolute legend ๐Ÿ’–๐ŸŽ€๐Ÿฆ‹

๐Ÿ“ฆ where this page comes from