Postfix : Error: No client certificate presented

Bonjour,

Je tente d’envoyer un e-mail, mais j’ai mon serveur qui rencontre une erreur :

<prenom.nom@medecin.mssante.fr>: host proxysmtp.mssante.fr[51.178.173.196]
    refused to talk to me: 421 4.7.1 mssxasmtap032.mss.sii.local Error: No
    client certificate presented

Au début, j’ai cru que le problème venait du fait que je n’avais pas activé le DKIM, je l’ai donc fait, mais je rencontre toujours cette erreur.

Avez-vous une piste pour lui présenter un certificat (si possible valide) ?

Bonjour,

Non aucune piste sans voir la configuration de ton serveur SMTP (Postfix, Exim ?)

Je précise que le serveur distant lui répond bien en présentant un certificat (auto-signé) à la commande :
openssl s_client -connect proxysmtp.mssante.fr:25 -starttls smtp

Il s’agit d’un serveur Postfix.
Voici son fichier /etc/postfix/main.cf :

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

smtpd_banner = $myhostname ESMTP $mail_name
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# TLS parameters
smtpd_use_tls = yes
smtpd_tls_cert_file=/etc/ssl/certs/mail.almtesh.net.pem
smtpd_tls_key_file=/etc/ssl/private/mail.almtesh.net.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_mandatory_exclude_ciphers = LOW, DES, MD5, RC4, aNULL
smtpd_tls_mandatory_protocols = TLSv1, SSLv3

smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

myhostname = mail.almtesh.net
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
message_size_limit = 536870912
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
virtual_uid_maps = static:8
virtual_gid_maps = static:8
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual-alias-maps.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_tls_auth_only = yes
maximal_queue_lifetime = 7d
bounce_queue_lifetime = 7d
initial_destination_concurrency = 1
default_destination_concurrency_limit = 1

# Wait until the RCPT TO command before evaluating restrictions
smtpd_delay_reject = yes

# Basics Restrictions
smtpd_helo_required = yes
strict_rfc821_envelopes = yes

# Requirements for the connecting server
smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        permit

# Requirements for the HELO statement
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_hostname,
        reject_invalid_hostname,
        permit

# Requirements for the sender address
smtpd_sender_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain,
        permit

# Requirement for the recipient address
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        reject_unauth_destination,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_unauth_pipelining,
        reject_invalid_hostname,
        check_policy_service unix:private/policy-spf ,
#       check_policy_service inet:127.0.0.1:10023
        permit

anvil_status_update_time = 7200

#DKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters

Voici le fichier /etc/postfix/master.cf :

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
submission inet n       -       y       -       -       smtpd
smtps     inet  n       -       y       -       -       smtpd
        -o smtpd_tls_wrappermode=yes
pickup    fifo  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       y       -       -       smtp
        -o smtp_fallback_relay=
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
policy-spf  unix  -       n       n       -       -       spawn
        user=nobody argv=/usr/bin/policyd-spf
maildrop  unix  -       n       n       -       -       pipe
        flags=DRhu user=mail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
        flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
        flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
        flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
        flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
        flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
        ${nexthop} ${user}

dovecot   unix  -       n       n       -       -       pipe
        flags=DRhu user=dovecot:dovecot argv=/usr/lib/dovecot/deliver -d ${recipient}

À moins que tu n’utilises une (très) vieille version de Postfix les directives :

smtpd_use_tls = yes
smtp_use_tls = yes

sont obsoletes. Il faut remplacer par :

smtpd_tls_security_level = may
smtp_tls_security_level = may

Ce qui évitera en plus de forcer l’usage de TLS au cas où le serveur distant ne le prenne pas en charge.
cf. Postfix Configuration Parameters
et RFC 3207 - SMTP Service Extension for Secure SMTP over Transport Layer Security

Après ces modifications et redémarrage du service Postfix, ton courriel devrait pouvoir être envoyé.

Bonjour,
Je ne connais pas la version de ton Postfix mais normalement smtp_use_tls est deprecie et il faudrait par exemple utilise ceci :
smtp_tls_security_level = dane

Pourrais tu donner le resultat de postconf -n

+1 mais voyons déjà si cela fonctionne avec may et avec dane cela exige d’autres paramètres :

smtp_host_lookup = dns
smtp_dns_support_level = dnssec
smtp_tls_security_level = dane

J’utilise la version de Debian bullseye, à savoir la 3.4.14.

C’est possible, en vrai, c’est une vieille configuration, quand je change de version, je regarde les messages d’erreur pour mettre à jour la configuration, mais comme je n’en ai pas eu pour ça, je n’ai rien touché.

Si le serveur distant ne prend pas en charge TLS, ça veut dire que l’e-mail est envoyé en clair ? Si c’est le cas, je préfère que mon e-mail ne soit pas envoyé et que j’aie une erreur.

┌ (almtesh@mail + 0) (02/07/22 - 9:13:25) (1.33 - 0%) (~)
└% postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
anvil_status_update_time = 7200
append_dot_mydomain = no
biff = no
bounce_queue_lifetime = 7d
broken_sasl_auth_clients = yes
default_destination_concurrency_limit = 1
dovecot_destination_recipient_limit = 1
inet_interfaces = all
inet_protocols = all
initial_destination_concurrency = 1
mailbox_size_limit = 0
maximal_queue_lifetime = 7d
message_size_limit = 536870912
milter_default_action = accept
milter_protocol = 2
mydestination = localhost
myhostname = mail.almtesh.net
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
non_smtpd_milters = $smtpd_milters
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_note_starttls_offer = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_use_tls = yes
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, permit
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_hostname, reject_invalid_hostname, permit
smtpd_milters = inet:localhost:8891
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_unauth_pipelining, reject_invalid_hostname, check_policy_service unix:private/policy-spf , permit
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unknown_sender_domain, permit
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/ssl/certs/mail.almtesh.net.pem
smtpd_tls_key_file = /etc/ssl/private/mail.almtesh.net.key
smtpd_tls_mandatory_exclude_ciphers = LOW, DES, MD5, RC4, aNULL
smtpd_tls_mandatory_protocols = TLSv1, SSLv3
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
strict_rfc821_envelopes = yes
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual-alias-maps.cf
virtual_gid_maps = static:8
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
virtual_transport = dovecot
virtual_uid_maps = static:8
┌ (almtesh@mail + 0) (02/07/22 - 9:13:38) (1.80 - 0%) (~)
└%

Mais, du coup, si le serveur DNS qui résout le nom de domaine de destination ne prend pas en charge le DNSSEC (ou qu’il n’est pas configuré), ça ne fonctionnera pas ?
Par ailleurs, cette machine a pour serveur DNS un dnsmasq pour le cache et un unbound pour la résolution en mode récursif, il me semble avoir activé le support du DNSSEC pour les deux, mais je ne sais pas comment le tester.

TLDR :
Le problème ne vient pas de ta configuration mais de l’adresse du destinataire qui est une messagerie privée.

Oui, la transaction se fera en clair.
La plupart des serveurs de courriel prennent en charge TLS mais pas tous. Donc si tu forces son utilisation tu risques d’être bloqué pour certaines destinations.
Si tu veux vraiment qu’un courriel soit confidentiel il faut le chiffrer avec GPG.

Pour DANE j’ai donné le lien vers la doc officielle, cela reste du TLS opportuniste et ne dépend pas de ton propre résolveur.

Ta configuration actuelle est correcte et fonctionnelle mais tu devrais la modifier suivant la doc indiquée (je te laisse le choix des valeurs pour forcer ou non TLS)

En revérifiant ton message d’erreur, je vois que le serveur distant envoie comme erreur :

Error: No  client certificate presented

Donc pour moi le problème vient du serveur distant proxysmtp.mssante.fr qui exige que le client (ton serveur Postfix) lui présente un certificat, ce qui n’est pas le comportement normal d’un serveur public.
On peut effectivement configurer Postfix pour que le client smtp (sans le d qui concerne le serveur) présente un certificat :

smtp_tls_cert_file=/etc/ssl/certs/mail.almtesh.net.pem
smtp_tls_key_file=/etc/ssl/private/mail.almtesh.net.key

mais c’est déconseillé par la doc officielle car ce n’est normalement pas nécessaire et risque de poser d’autres problèmes.
Et même si tu ajoutais ces directives, je doute fort que le serveur distant proxysmtp.mssante.fraccepte ton courriel car cela semble être une messagerie privée très restrictive :
https://mssante.fr/comprendre-mssante

1 J'aime

Ah, d’accord, merci, je n’avais pas trouvé cette page.
En fait, c’est un service qui utilise le SMTP et qui ajoute un genre de couche de sécurité par dessus pour que les e-mails qui arrivent dans les boîtes soient vérifiés quant à leur origine.
En fait, le but était de pouvoir envoyer des documents à un professionnel de santé, sa boîte courante étant chez GMail, je n’avais pas envie de balancer ce genre de documents dans Google.

En résumé, pour ma situation, le mieux serait de demander à ce professionnel de santé de prendre une boîte chez un prestataire respectueux de la vie privée (genre Proton), voire agréé pour le traitement des données de santé.
Merci à toi @anon70622873 (ça faisait longtemps que je n’avais pas vu un TLDR) et merci à toi @micky979.