On 11/20/23 19:57, Viktor Dukhovni via Postfix-users wrote:
#### This mail comes from external sender! ####


On Mon, Nov 20, 2023 at 04:01:05PM +0100, Marc Dierksen via Postfix-users wrote:

For the domain 'shieldersme.com' outbound TLS is configured via this entry
in the TLS policy map:

shieldersme.com verify match=hostname:nexthop:dot-nexthop ciphers=high
protocols=>=TLSv1.2

When trying to send mail I am getting the following error:

Nov 17 12:23:50 postfix-outbound/smtp[11269]: server certificate
verification failed for shieldersme.com[5.79.80.155]:25: num=62:hostname
mismatch

This is easily reproducible:

     $ posttls-finger -c -Lsummary -lsecure "shieldersme.com" hostname nexthop 
dot-nexthop
     posttls-finger: server certificate verification failed for 
shieldersme.com[5.79.80.155]:25: num=62:hostname mismatch
     posttls-finger: Untrusted TLS connection established to 
shieldersme.com[5.79.80.155]:25: TLSv1.2 with cipher 
ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)

And expected (i.e. works as indended and specified in all relevant RFCs):

     $ posttls-finger -cC -Lsummary -lsecure "shieldersme.com" hostname nexthop 
dot-nexthop 2>&1 |
         openssl crl2pkcs7 -nocrl -certfile /dev/stdin |
         openssl pkcs7 -print_certs -text |
         grep -E 'Subject:|DNS:'
             Subject: CN=liger.hibridmena.com
                     DNS:liger.hibridmena.com
             Subject: C=US, ST=TX, L=Houston, O=cPanel, Inc., CN=cPanel, Inc. 
Certification Authority
             Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA 
Limited, CN=COMODO RSA Certification Authority

The actual certificate presented to Postfix is for:

     liger.hibridmena.com

Your tests with "openssl s_client" sent a default SNI etension, but
Postfix does not by default.  With SMTP, it is unclear, in general, what
the SNI should be, and sending the "wrong" SNI can sometimes cause
connection aborts.  Therefore, if you want to solicit a particular
certificate, you have to configure the SNI explicitly.

     $ posttls-finger -cC -s shieldersme.com -Lsummary -lsecure "shieldersme.com" 
hostname nexthop dot-nexthop 2>&1 |
         openssl crl2pkcs7 -nocrl -certfile /dev/stdin |
         openssl pkcs7 -print_certs -text |
         grep -E 'Subject:|DNS:'
             Subject: CN=*.shieldersme.com
                     DNS:*.shieldersme.com, DNS:shieldersme.com
             Subject: C=US, O=Let's Encrypt, CN=R3
             Subject: C=US, O=Internet Security Research Group, CN=ISRG Root X1

Relevant documentation:

     posttls-finger(1):
        -s servername
               The server name to send with the TLS Server Name Indication
               (SNI) extension.  When the server has DANE TLSA records, this
               parameter is ignored and the TLSA base domain is used instead.
               Otherwise, SNI is not used by default, but can be enabled by
               specifying the desired value with this option.

     postconf(5):
        may    Opportunistic TLS. Since sending in the clear is acceptable,
               demanding stronger than default TLS security merely reduces
               interoperability. The optional "ciphers", "exclude", and
               "protocols" attributes (available for opportunistic TLS with
               Postfix >= 2.6) and "connection_reuse" attribute (Postfix >=
               3.4) override the "smtp_tls_ciphers",
               "smtp_tls_exclude_ciphers", "smtp_tls_protocols", and
               "smtp_tls_connection_reuse" configuration parameters. In the
               policy table, multiple ciphers, protocols or excluded ciphers
               must be separated by colons, as attribute values may not contain
      ---->    whitespace or commas.  At this level and higher, the optional
      ---->    "servername" attribute (available with Postfix >= 3.4) overrides
      ---->    the global "smtp_tls_servername" parameter, enabling
      ---->    per-destination configuration of the SNI extension sent to the
      ---->    remote SMTP server.  The optional "enable_rpk" attribute
               (Postfix >= 3.9) overrides the main.cf smtp_tls_enable_rpk
               parameter.  When opportunistic TLS handshakes fail, Postfix
               retries the connection with TLS disabled.  This allows mail
               delivery to sites with non-interoperable TLS implementations.

You need to add "servername=shieldersme.com" to the policy table entry.

Also, in this case, using "hostname" is a bad idea, it means you'd trust
insecurely obtained forged MX records to tell the client what name to
match, so any active attacker can compromise the connection by sending
a suitably crafted MX response.  The match pattern you want here is

     nexthop:dot-nexthop

*without* "hostname".  Or (less fungible) even just "nexthop", if by
mutual agreement with the receiving system, you're sure that the cert
will "always" include the domain.


Viktor, thank you for your explanation. Now it makes sense.

I did not know about the posttls-finger command. I will use that in the future instead of openssl when tracking down TLS problems in Postfix.

I will contact the manufacturer of that mailgateway appliance and suggest they adjust the TLS policy map configuration to include the 'servername' option and leave out 'hostname' for the 'match' clause.

A big thanks to both Wietse and you for your great work!
_______________________________________________
Postfix-users mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to