Générer et configurer un certificat SSL sur Postfix

Vous pouvez installer un certificat SSL/TLS sur Postfix afin de recevoir et envoyer des mails chiffrés.
Ainsi, les mails transitent sur votre serveur SMTP de manière chiffrés.
C'est la première étape pour un chiffrement bout en bout pour apporter de la confidentialité et protèger contre les attaques MiTM.

Ce tutoriel fournit des instructions détaillées pour générer un certificat SSL auto-signé ou let's encrypt.
Puis comment configurer le certificat dans Postfix.

Générer et configurer un certificat SSL sur Postfix

Introduction et prérequis

La première étape de la configuration d'un serveur de messagerie fiable consiste à créer les enregistrements DNS.
Ce processus sera différent selon le serveur de noms de domaine que vous utilisez pour gérer votre nom de domaine. La plupart des serveurs de noms de domaine fourniront des instructions ou de la documentation sur la manière dont ces paramètres peuvent être définis.

Vous pouvez créer un enregistrement DNS A :

mail.domaine.tld   A    51.98.12.15.65

A partir de là, vous pouvez générer votre certificat SSL à intégrer dans Postfix.
Dans ce tutoriel, je vous propose deux méthodes :

  • Let's Encrypt une autorité de certification gratuite
  • Un certificat auto-signé : Le certificat est généré par vous même et non par une autorité de certification. Cela peut parfois poser des problèmes de chiffrement pour les services qui rejette ce type de certificat

Générer un certificat SSL pour Postfix

Créer un certificat let's Encrypt pour Postfix

Let's Encrypt est une autorité de certification gratuite, automatisée et ouverte qui permet une configuration facile des certificats à l'aide du client Certbot ACME de l'Electronic Frontier Foundation.

  • Installez certbot, par exemple sur Debian avec APT :
sudo apt install certbot
  • Puis on utilise certbot pour générer le certificat let's encrypt :
sudo certbot certonly --standalone -d mail.domaine.tld

La commande démarre un script de configuration interactif qui posera quelques questions pour configurer correctement le certificat.

  • Sélectionnez Oui pour utiliser le fichier vhost par défaut et spécifiez les paramètres manuellement.
  • Entrez le nom de domaine du serveur de messagerie comme mail.example.com.
  • Lors de la première installation sur un hôte spécifique, vous devrez entrer un e-mail de contact.
  • Lisez les conditions d'utilisation de Let's Encrypt et sélectionnez Accepter pour continuer.
  • Sélectionnez ensuite si vous souhaitez utiliser à la fois HTTP et HTTPS ou exiger que tout le trafic utilise le cryptage en mettant en surbrillance l'option Facile ou Sécurisé et en sélectionnant OK.
  • Si tout a fonctionné correctement, vous recevrez un message indiquant que HTTPS a été activé avec succès.

Si l'opération réussi, les certificats let's encrypt se trouvent dans l'emplacement : /etc/letsencrypt/live/domaine.tld/

Créer un certificat Postfix auto-signé

Un certificat d'auto-signature signifie qu'il n'est pas émis par une autorité de certification de confiance publique comme Let's Encrypt. Cela signifie que le certificat ne sera pas approuvé par les applications qui font uniquement confiance aux certificats émis publiquement.

  • Installez OpenSSL, par exemple avec APT pour Debian :
sudo apt install openssl
  • Générez une clé privée RSA de 2048 bits avec openssl :
openssl genrsa -des3 -out mail.domaine.tld.key 2048
  • Saisissez une pass phase qui sera utilisée dans les commandes suivantes
  • Puis on génère une demande de signature de certificat.
  • Cette étape vous posera des questions. Commencez par saisir la pass phrase
  • Remplissez les informations, la partie importante est Common Name (eg, YOUR name) où vous devez saisir l'adresse de votre serveur mail, par exemple : mail.domain.tld
  • Dans A challenge password, laissez vide


openssl req -new -key mail.domaine.tld.key -out mail.domaine.tld.csr
  • Puis dans la troisième commande, on génère un certificat x509 auto-signé.
openssl x509 -req -days 365 -in mail.domaine.tld.csr -signkey mail.domaine.tld.key -out mail.domaine.tld.crt
  • Puis on supprime le mot de passe de la clé privée :
openssl rsa -in mail.domaine.tld.key -out mail.domaine.tld.key.nopass
mv mail.domaine.tld.key.nopass mail.domaine.tld.key
  • Enfin on créé notre autorité de certification de confiance :
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
  • Enfin on peut déplacer les certificats dans les bon emplacement du système :
mv mail.domain.tld.key /etc/ssl/private/
mv mail.domain.tld.crt /etc/ssl/certs/
mv cakey.pem /etc/ssl/private/
mv cacert.pem /etc/ssl/certs/

Configurer un certificat SSL sur Postfix

On obtient donc ceci :

  • Votre fichier de clé privée : vous avez généré le fichier de clé ainsi que le code CSR sur votre serveur
  • Votre certificat SSL principal : il réside dans le dossier archivé ZIP que vous avez reçu de l'autorité de certification. Vérifiez votre courrier électronique et téléchargez, puis extrayez votre certificat SSL. Pour les besoins de cette démonstration, nous nommerons le fichier de certificat SSL principal .crt
  • L'AC intermédiaire : il s'agit du fichier CA bundle (.ca-bundle) du même dossier ZIP que votre certificat SSL. Dans notre cas, nous nommerons le fichier intca.crt

Ensuite, on configure postfix à travers la commande postconf :

postconf -e 'smtp_use_tls = yes'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_auth_only = no'
postconf -e 'smtpd_tls_key_file = /etc/ssl/private/mail.domaine.tld.key'
postconf -e 'smtpd_tls_cert_file = /etc/ssl/certs/mail.domaine.tld.crt'
postconf -e 'smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem'
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
postconf -e 'tls_random_source = dev:/dev/urandom'
postconf -e 'myhostname = mail.domaine.tld'

Pour le certificat let's encrypt le chemin diffère mais le principe reste le même :

smtpd_tls_key_file = /etc/letsencrypt/live/domaine.tld/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/domaine.tld/cert.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/domaine.tld/fullchainchain.pem

Pour une configuration complète de Postfix, suivez ce tutoriel :

Tester le chiffrement de votre mail

Pour vérifier la connexion chiffrée entrante à votre serveur SMTP, vous pouvez utiliser openSSL.
La commande à utiliser :

openssl s_client -connect smtp.orange.fr:25 -starttls smtp

Pour vérifier que les mails envoyés depuis Postfix sont bien chiffrés, vous pouvez envoyer un mail à Gmail, Protonmail ou autre service de messagerie.
En général, ces derniers vous indique si le mail est transmis de manière chiffré.

Mail transmis par un chiffrement TLS