On veut sécuriser l'accès à nos sites et nos solutions de webmail en HTTPS (port TCP 443) et sécuriser également la réception et l'envoi des e-mails depuis notre serveur, pour cela nous avons besoin de certificats SSL.
Des certificats "auto-signés" (nous verrons ce que cela veut dire) ont été automatiquement générés par le script d'installation de la solution iRedMail mais on peut aussi soit acheter un ou plusieurs certificats SSL auprès d'une autorité de certification officielle soit créer sa propre autorité de certification et générer ses propres certificats. Nous verrons qu'il existe une troisième solution.
Certificats payants
Il existe un grand nombre d'autorités de certifications officielles (GeoTrust, Thawte, etc...) chez qui on peut acheter son certificat SSL. Par exemple, la société Namecheap propose une solution "PositiveSSL Wildcard" qui, pour environ 80€ ou 90€ par an, permet d'obtenir un certificat SSL unique qui marche pour n'importe quel nom d'hôte appartenant à un même domaine.
Par exemple, pour le domaine spou.net, le même certificat marchera pour les noms d'hôte autodiscover.spou.net, patate.spou.net, pmail.spou.net, etc...
Il faut commencer par créer, sur le serveur, un fichier "/etc/ssl/STAR_spou_net.conf" avec ce type de contenu (à noter que les indications de pays, ville, etc... données dans ce fichier n'ont pas forcément besoin d'être véridiques) :
[req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] C = FR ST = Poulpe State L = Poulpeville O = Poulpe Corp. OU = Poulpe Corp. special unit CN = *.spou.net [v3_req] keyUsage = keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth, clientAuth subjectAltName = @alt_names [alt_names] DNS.1 = spou.net DNS.2 = *.spou.net
Toujours sur le serveur, on crée maintenant une clé privée et un fichier de demande de certificat (CSR) en exécutant la commande ci-dessous :
# sudo openssl req -nodes -newkey rsa:2048 -keyout /etc/ssl/STAR_spou_net.key -out /etc/ssl/STAR_spou_net.csr -config /etc/ssl/STAR_spou_net.conf
Il suffit ensuite de suivre les instructions sur le site internet du fournisseur de certificat.
Dans le cas de Namecheap, il faudra notamment copier le contenu du fichier "/etc/ssl/STAR_spou_net.csr" obtenu avec la commande précédente pour recevoir ensuite un e-mail contenant un fichier ZIP dans lequel se trouvera un certain nombre de fichiers dont un nommé "STAR_spou_net.crt".
On copie et on décompresse l'archive ZIP en question sur le serveur, s'il y a un deuxième fichier nommé "STAR_spou_net.ca-bundle" en plus du fichier "STAR_spou_net.crt", on renomme le fichier en question en "STAR_spou_net.ca".
Si par contre il n'y a pas de tel fichier mais à la place une multitude de fichiers se terminant par l'extension ".crt" autres que "STAR_spou_net.crt", on combine ces fichiers en un seul, en faisant ce genre de commande depuis le répertoire où se trouvent les fichiers dézippés (à adapter selon les fichiers présents pour vous) :
# cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt >> STAR_spou_net.ca
On va également combiner le fichier "STAR_spou_net.crt" et "STAR_spou_net.ca" en un seul fichier "STAR_spou_net.fullchain", cela nous sera notamment utile pour nos serveurs Nginx, Postfix et Dovecot :
# cat STAR_spou_net.crt STAR_spou_net.ca >> STAR_spou_net.fullchain
Enfin, il faut mettre tous ces fichiers dans le dossier "/etc/ssl" :
# sudo mv STAR_spou_net.* /etc/ssl
Certains matériels réseau, comme des firewalls, qui fournissent une interface web pour les gérer, et pour lesquels on souhaiterait utiliser notre certificat SSL pour protéger l'accès à cette interface (si bien sûr on a créé au préalable un nom d'hôte depuis l'interface du fournisseur de nom de domaine spou.net qui pointe vers l'adresse IP d'administration de ce type de matériel), ont besoin du certificat au format PKCS#12.
La conversion de notre certificat en un fichier unique au format PKCS#12 peut se faire grâce à la commande suivante (il nous sera demandé de choisir un mot de passe pour protéger ce fichier, il ne restera plus qu'à importer le fichier "/etc/ssl/STAR_spou_net.p12" produit et de donner le mot de passe choisi précédemment lors de l'importation sur le matériel réseau) :
# sudo openssl pkcs12 -export -out /etc/ssl/STAR_spou_net.p12 -inkey /etc/ssl/STAR_spou_net.key -in /etc/ssl/STAR_spou_net.crt -certfile /etc/ssl/STAR_spou_net.ca
Certificats gratuits "auto-signés"
Dans le cas où on veut générer nous même nos propres certificats gratuitement, on parle alors de certificats SSL "auto-signés" (sachant que de tels certificats ont déjà été générés par le script d'installation de la solution iRedMail), on exécute les commandes ci-dessous qui vont créer tout d'abord un certificat "général" qui nous servira en tant qu'autorité de certification non-officielle (auto-dénommée "Poulpe CA") pour générer et signer ensuite autant de certificats SSL qu'on le souhaite (mais ici on va en générer un seul qui fonctionne pour tous les noms d'hôte du domaine spou.net et qui sera valable 10 ans, soit 3650 jours) :
# sudo openssl genrsa -out /etc/ssl/CA_spou_net.key 2048 # sudo openssl req -new -x509 -days 3650 -key /etc/ssl/CA_spou_net.key -subj "/C=FR/ST=Poulpe State/L=Poulpeville/O=Poulpe Corp./CN=Poulpe CA" -out /etc/ssl/CA_spou_net.crt # sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/ssl/STAR_spou_net.key -subj "/C=FR/ST=Poulpe State/L=Poulpeville/O=Poulpe Corp./CN=*.spou.net" -out /etc/ssl/STAR_spou_net.csr # sudo bash -c 'openssl x509 -req -extfile <(printf "subjectAltName=DNS.1:spou.net,DNS.2:*.spou.net,IP:172.31.253.254") -days 3650 -in /etc/ssl/STAR_spou_net.csr -CA /etc/ssl/CA_spou_net.crt -CAkey /etc/ssl/CA_spou_net.key -CAcreateserial -out /etc/ssl/STAR_spou_net.crt' # sudo ln -sf /etc/ssl/CA_spou_net.crt /etc/ssl/STAR_spou_net.ca # sudo sh -c 'cat /etc/ssl/STAR_spou_net.crt /etc/ssl/STAR_spou_net.ca >> /etc/ssl/STAR_spou_net.fullchain'
Par contre, un certificat auto-signé provoquera des erreurs lorsque les utilisateurs visiteront nos différents sites web. Il faut obligatoirement envoyer à chacun des utilisateurs (par e-mail, clé USB ou autre) le fichier "/etc/ssl/CA_spou_net.crt" créé précédemment et qui permet d'authentifier notre autorité de certification non-officielle. Les utilisateurs devront ensuite aller dans leur navigateur internet préféré et ajouter ce certificat racine "CA_spou_net.crt".
Sur Google Chrome, par exemple, il faut aller dans les paramètres, cliquer sur "paramètres avancés", cliquer sur "Gérer les certificats", cliquer sur le bouton "importer" et suivre les instructions. Il faut notamment cocher le bouton "Placer tous les certificats dans le magasin suivant", cliquer sur le bouton "Parcourir" et choisir le dossier "Autorités de certification racines de confiance" (il faut peut-être un compte utilisateur avec des droits d'administration sur le poste, sur Windows notamment, pour faire cela) et on redémarre le navigateur internet.
Si besoin, la conversion de notre certificat auto-signé en un fichier au format PCKS#12 se fait grâce à la commande suivante :
# sudo openssl pkcs12 -export -out /etc/ssl/STAR_spou_net.p12 -inkey /etc/ssl/STAR_spou_net.key -in /etc/ssl/STAR_spou_net.crt -certfile /etc/ssl/CA_spou_net.crt
Let's Encrypt : certificats gratuits et reconnus
Il existe heureusement une solution qui réunie le meilleur des deux mondes précédents en permettant de générer des certificats SSL gratuits ET reconnus officiellement par les navigateurs internet. Ceci peut être obtenu grâce au service Let's Encrypt qui fournit l'outil Certbot que l'on installe grâce à cette commande :
# sudo apt install -y certbot python3-certbot-apache python3-certbot-nginx
Avant de lancer l'outil Certbot que l'on vient d'installer, il faut tout d'abord arrêter tout serveur qui écoute sur le port HTTP 80, c'est le cas de Nginx qui a été installé précédemment grâce au script d'installation de la solution iRedMail :
# sudo service nginx stop
On peut alors lancer la commande ci-dessous pour créer les différents certificats SSL pour nos sites web :
# sudo certbot certonly
Contrairement à un certificat auto-signé ou acheté auprès d'une autorité de certification officielle, on ne peut pas créer avec Certbot un certificat "wildcard" unique qui marcherait pour n'importe quel nom d'hôte appartenant à un même domaine. On est obligé de prévoir en avance tous les noms d'hôte pour lesquels on souhaite créer un certificat.
Dans l'exemple ci-dessous, on va créer un certificat pour tous les noms d'hôte que l'on a configuré précédemment auprès de notre fournisseur de nom de domaine, à savoir patate.spou.net, p.spou.net, patate2.spou.net et pmail.spou.net. Ce qui donne l'affichage ci-dessous lorsque l'on exécute la commande précédente.
Cela nous demandera au début de saisir une adresse e-mail, on indique l'adresse postmaster@p.spou.net qui a été configurée grâce au script d'installation de la solution iRedMail, et cela nous dira à la fin que l'on pourra retrouver tous les fichiers du certificat SSL généré dans le dossier "/etc/letsencrypt/live/patate.spou.net" et que ce certificat est valable jusqu'au 10 février 2024 sachant que nous avions exécuté la commande le 10 novembre 2023 (les certificats Let's Encrypt sont valables 3 mois mais renouvelables à volonté et de manière automatique comme nous le verrons plus tard) :
Saving debug log to /var/log/letsencrypt/letsencrypt.log How would you like to authenticate with the ACME CA? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: Apache Web Server plugin (apache) 2: Nginx Web Server plugin (nginx) 3: Spin up a temporary webserver (standalone) 4: Place files in webroot directory (webroot) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-4] then [enter] (press 'c' to cancel): 3 Plugins selected: Authenticator standalone, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): postmaster@p.spou.net - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: n Account registered. Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): patate.spou.net p.spou.net patate2.spou.net pmail.spou.net Requesting a certificate for patate.spou.net and 3 more domains Performing the following challenges: http-01 challenge for p.spou.net http-01 challenge for patate.spou.net http-01 challenge for patate2.spou.net http-01 challenge for pmail.spou.net Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/patate.spou.net/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/patate.spou.net/privkey.pem Your certificate will expire on 2024-02-10. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Normalement, les certificats créés avec Certbot sont renouvelés automatiquement grâce au fichier "/etc/cron.d/certbot" qui a du être installé automatiquement, mais si ce fichier n'existe pas ou ne fonctionne pas, on exécute la commande suivante :
# sudo crontab -e
Et on ajoute la ligne suivante à la fin du fichier (suivie d'une ligne vide) :
@daily /usr/bin/certbot renew --quiet
Remplacer les certificats SSL générés par le script d'installation d'iRedMail
Si on souhaite remplacer les certificats SSL générés précédemment par le script d'installation de la solution iRedMail (et qui ne sont pas officiellement reconnus par les navigateurs internet puisque ce sont des certificats auto-signés) par un certificat gratuit généré grâce à Certbot comme nous l'avons vu précédemment, on exécute les commandes suivantes :
# sudo ln -sf /etc/letsencrypt/live/patate.spou.net/privkey.pem /etc/ssl/private/iRedMail.key # sudo ln -sf /etc/letsencrypt/live/patate.spou.net/fullchain.pem /etc/ssl/certs/iRedMail.crt
Dans le cas d'un certificat auto-signé et surtout d'un certificat que l'on a acheté auprès d'une autorité de certification officielle comme vu précédemment, on exécutera plutôt les commandes suivantes :
# sudo ln -sf /etc/ssl/STAR_spou_net.key /etc/ssl/private/iRedMail.key # sudo ln -sf /etc/ssl/STAR_spou_net.fullchain /etc/ssl/certs/iRedMail.crt
Commentaires