Première rédaction de cet article le 28 février 2007
Dernière mise à jour le 1 mars 2007
La demande de sécurité dans les envois de courrier électronique fait que de plus en plus de serveurs SMTP activent l'option de cryptographie TLS (nouveau nom de SSL). Cette option est normalisée dans le RFC 3207.
Voici ce que j'ai configuré sur mon serveur
Postfix. Cela permet la confidentialité (TLS
chiffre la session) et, dans une certaine mesure, l'authentification
des serveurs pairs (en revanche, TLS dans le courrier n'authentifie
pas l'expéditeur, il faudrait utiliser PGP). Il
faut avoir installé OpenSSL et compilé Postfix avec le support de
SSL. Sur Debian, cela se fait en installant le
paquetage postfix-tls. Sur Gentoo, en compilant
Postfix en ayant l'option "ssl" dans les USE (par exemple, en le
mettant dans /etc/make.conf
).
J'ai créé une autorité de certification (ce
qui est très simple mais Kim Minh Kaplan suggère que j'aurais pu
utiliser une autorité gratuite et ouverte comme http://cacert.org/
) et tous les exemples ci-dessous supposent
l'utilisation de cette CA. Les certificats signés par des CA locales
sont bien plus répandus pour le courrier (où aucune vérification n'est
faite, en général), que sur le Web où le navigateur vous impose une
demi-douzaine de confirmations si vous osez utiliser une autre CA que
celles qui sont installées avec le logiciel :
/etc/ssl/misc/CA.pl -newca
et mis les fichiers (certificat de la CA, certificats signés, etc)
dans /etc/ssl/CA
.
Un utilisateur ordinaire peut ensuite, sur sa machine, générer une demande de certificat, ici pour mille jours :
openssl req -config /etc/ssl/openssl.cnf -new -nodes -keyout monserveur.key -out monserveur.csr -days 1000
Cette demande doit ensuite être signée par la CA pour être un certificat valide :
openssl ca -config ../openssl.cnf -policy policy_anything -days 1000 -out certs/monserveur.crt -infiles ~/tmp/monserveur.csr
Ces fichiers sont ensuite copiés là où Postfix les attend. Si on a mis
dans le main.cf
:
smtpd_tls_key_file = /etc/postfix/postfix-key.pem smtpd_tls_cert_file = /etc/postfix/postfix-cert.pem
on copie la clé en /etc/postfix/postfix-key.pem
et le certificat en /etc/postfix/postfix-cert.pem
.
On peut vérifier ses certificats avec :
openssl x509 -text -noout -in postfix-cert.pem
Il affichera en clair toutes les informations contenues dans le certificat.
On peut alors configurer Postfix. Le serveur prend typiquement les
paramètres suivants (notez que la configuration du serveur,
smtpd
et du client, smtp
sont complètement indépendantes) :
# TLS non obligatoire, a la demande du client smtpd_tls_security_level = may smtpd_tls_auth_only = no # Emplacement des cles et certificats smtpd_tls_key_file = /etc/postfix/postfix-key.pem smtpd_tls_cert_file = /etc/postfix/postfix-cert.pem # Facultatif: #smtpd_tls_CAfile = /etc/postfix/cacert.pem # Si on veut authentifier les autres, il faut indiquer ou trouver les certificats # des CA : #smtpd_tls_CApath = /etc/ssl/certs # Enregistrer dans un en-tete Received smtpd_tls_received_header = yes smtpd_tls_loglevel = 1 # Divers smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom
Le serveur, une fois rechargé, doit alors accepter les connexions TLS. On peut le vérifier avec telnet :
% telnet munzer.example.org smtp Trying 208.75.84.80... Connected to munzer.example.org. Escape character is '^]'. 220 munzer.example.org ESMTP Postfix EHLO foo.bar.example 250-munzer.example.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
La ligne STARTTLS nous indique que le serveur est prêt à faire du TLS.
Pour configurer un client SMTP en TLS, on met
dans le main.cf
:
smtp_tls_security_level = may smtp_tls_loglevel = 1 # Le client n'a pas forcement les memes certificats que le serveur smtp_tls_cert_file = /etc/postfix/postfix-cert.pem smtp_tls_key_file = /etc/postfix/postfix-key.pem
Désormais, en envoyant un message depuis ce client vers ce serveur, on aura dans le journal l'information que TLS a été utilisé :
Feb 28 14:34:16 munzer postfix/smtpd[17374]: TLS connection established from foobar.example.net[192.0.2.53]: TLSv1 with cipher ADH-AES256-SHA (256/256 bits)
La même information se retrouve dans les en-têtes du message :
Received: from mail.example.com (foobar.example.net [192.0.2.53]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by munzer.example.org (Postfix) with ESMTP id CC60F8C021 for <stephane@bortzmeyer.org>; Wed, 28 Feb 2007 14:34:16 +0100 (CET)
Si on demande un certificat au client :
smtpd_tls_ask_ccert = yes
on obtient un en-tête Received ainsi :
Received: from mail.example.com (foobar.example.net [192.0.2.53]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "smtp.bortzmeyer.org", Issuer "Stephane Bortzmeyer" (verified OK)) by mail.bortzmeyer.org (Postfix) with ESMTP id 59E6F24080E for <stephane@bortzmeyer.org>; Thu, 1 Mar 2007 17:40:36 +0100 (CET)
et, dans le journal :
Mar 1 17:40:36 ariane postfix/smtpd[3356]: Verified: subject_CN=smtp.bortzmeyer .eu, issuer=Stephane Bortzmeyer Mar 1 17:40:36 ariane postfix/smtpd[3356]: TLS connection established from foobar.example.net [192.0.2.53]: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 b its)
À noter qu'on peut tester TLS en ligne de commande avec :
% openssl s_client -connect MYMAILSERVER:smtp -starttls smtp -cert /etc/postfix/postfix-cert.pem -key /etc/postfix/postfix-key.pem -CAfile /etc/postfix/cacert.pem
Attention, par défaut, il vérifie le certificat du serveur, il faut donc avoir une chaîne de CA valides chez le client. Si on veut juste regarder le certificat, par exemple pour voir sa validité :
% openssl s_client -connect MYMAILSERVER:smtp -starttls smtp \ -cert /etc/postfix/postfix-cert.pem -key /etc/postfix/postfix-key.pem \ -CAfile /etc/postfix/cacert.pem & /dev/null | \ openssl x509 -noout -subject -startdate -enddate
Un autre outil de test est ssl-cert-check qui permet des choses comme :
% ssl-cert-check -s mail.bortzmeyer.org -p 25 Host Status Expires Days ----------------------------------------------- ------------ ------------ ---- mail.bortzmeyer.org:25 Valid Nov 10 2010 673
On trouvera beaucoup d'autres détails dans :
Vous pouvez tester votre serveur en ligne. Et, naturellement, pour un test complet, on peut utiliser les auto-répondeurs de courrier dont plusieurs acceptent TLS.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)