Lors du déploiement du protocole `https` sur des sites clients, j'ai souvent rencontré diverses difficultés qui provenaient d'un manque de compréhension des enjeux et d'une trop grande complexité des concepts.
Dans ce tutoriel, je décris en détail les étapes pour obtenir et déployer un certificat valide sur un serveur web.
**Dans chaque sous-titre, je résume toujours brièvement l'étape pour les utilisateurs avancés, et en bas, je discute des détails pour les débutants.
**Attention : ** L'ensemble du processus de déploiement d'un certificat peut prendre plus d'une heure et est souvent intermittent (le site peut être indisponible).
Les instructions supposent que nous avons accès à un serveur web terminal fonctionnant sous Linux et utilisant Apache.
Pour Nginx, toute la théorie s'applique de la même manière, mais la liaison du fichier de certificat est différente.
Nous nous connectons au serveur via SSH.
Sur Mac ou Linux, appelez la commande :
ssh uživatel@server
Par exemple, je veux me connecter à l'utilisateur root
sur le site baraja.cz
:
ssh root@baraja.cz
Ou à l'utilisateur jan
vers une adresse IP spécifique :
ssh jan@127.0.0.1
Après avoir soumis votre demande, soit la connexion sera établie directement, soit un mot de passe vous sera demandé. Rien ne s'affiche lors de la saisie du mot de passe, il faut donc confirmer le mot de passe avec la touche entrée et attendre que la connexion soit autorisée.
**Attention : ** Si nous n'avons pas de droits sur une action, nous devons les attribuer. Soit vous passez directement à l'utilisateur
root
avec la commandesudo su
, soit vous faites précéder la commande que vous voulez exécuter sous root du motroot
au début, par exempleroot rm <name>
sous root supprimera le fichier<name>
. Lorsque l'on utilise la commandesudo
, on peut être périodiquement invité à saisir un mot de passe.
Détails:
L'accès SSH est mis en place par l'hébergement particulier où vous avez loué un serveur.
Si vous convertissez un site existant de http
en https
, vous devez garantir que tout le trafic est redirigé vers le nouveau protocole https
.
Dans le cas d'Apache, cela peut être facilement réalisé en utilisant une redirection dans le fichier .htaccess
:
<IfModule mod_rewrite.c>RewriteEngine OnRewriteCond %{HTTPS} !onRewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]</IfModule>
Cette configuration fera en sorte que toutes les requêtes vers http
seront redirigées avec le HTTP code 301
vers https
. Cette configuration est la configuration par défaut pour le cadre Nette, mais elle s'applique également à tous les autres cas.
Détails:
Le fichier .htaccess
contient la configuration spécifique du serveur web qui affecte chaque requête. Il est généralement placé dans le même répertoire que index.php
, ou d'autres fichiers accessibles depuis Internet.
Son paramétrage est uniquement valable pour le serveur Apache et peut être désactivé ou restreint pour certains hôtes. Pour des informations plus détaillées, contactez toujours l'hébergeur de votre site.
Il arrive parfois que .htaccess
ne veuille pas bien coopérer et que la configuration soit extrêmement difficile (par exemple pour de nombreux domaines, chacun se comportant différemment). Dans ce cas, la redirection vers HTTPS peut être gérée directement en PHP :
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {$location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];header('HTTP/1.1 301 Déplacement permanent');header('Emplacement :' . preg_replace('/^(https:\/\/(?:www\.)(.*)$/', '$1$2', $location));die;}
Mettez le script dans index.php
. Cependant, je ne recommande pas cette solution.
Dans le cas d'Apache, nous devons trouver le fichier Virtual hosts.
Ils sont généralement situés dans le chemin /etc/apache2/sites-available
.
Lister le contenu du répertoire avec la commande ls -al
et trouver le fichier où le virtuel est configuré pour notre site.
Les VirtualHosts sont généralement situés dans des fichiers avec l'extension .conf
. La valeur par défaut est souvent dans 000-default.conf
.
Détails:
cd
, par exemple cd /etc/apache2/sites-available
.cat <nom>
, ou édité à l'aide des commandes nano <nom>
ou vim <nom>
.CTRL + X
ou en appuyant deux fois sur ESC
.mc
), qui dans le cas d'Ubuntu est installé simplement avec apt-get install mc
ou sudo apt-get install mc
.Dans l'hôte virtuel, nous devons en préparer un nouveau pour le port 443
(un problème courant peut être le blocage du port 443 sur le pare-feu).
Le contenu du fichier peut ressembler à ceci, par exemple :
<IfModule mod_ssl.c><VirtualHost *:443>ServerName baraja.czServerAdmin jan@barasek.comDocumentRoot /var/www/baraja.cz/wwwHeader always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"ErrorLog ${APACHE_LOG_DIR}/baraja.cz.ssl.error.logCustomLog ${APACHE_LOG_DIR}/baraja.cz.ssl.access.log combinedSSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crtSSLProtocol all -SSLv3SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSSSSLHonorCipherOrder onSSLCompression off<FilesMatch "\.(cgi|shtml|phtml|php)$">SSLOptions +StdEnvVars</FilesMatch><Directory /usr/lib/cgi-bin>SSLOptions +StdEnvVars</Directory>BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0# MSIE 7 and newer should be able to use keepaliveBrowserMatch "MSIE [17-9]" \ssl-unclean-shutdown</VirtualHost></IfModule>
Le dossier est la zone la plus importante :
SSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crt
Il est absolument essentiel de comprendre cette configuration. Si vous devez chercher des informations plus détaillées sur Google, utilisez les mots SSLCertificateFile
, SSLCertificateKeyFile
et SSLCertificateChainFile
qui sont communs à tous les serveurs Apache.
Avertissement: Le problème SSL est relativement ancien et des noms différents sont souvent utilisés pour la même chose afin de maintenir une compatibilité descendante ! Il est donc important de comprendre le principe.
Détails:
Il est important que VirualHost contienne :
<IfModule mod_ssl.c>
indique que nous voulons utiliser SSL<VirtualHost *:443>
que toute communication se fera sur le port 443SSLEngine on
que SSL est activé pour ce VirtualHostSSLCertificateFile
, SSLCertificateKeyFile
et SSLCertificateChainFile
sont des fichiers contenant des clés spécifiques.Rien d'autre n'est nécessaire.
Dans la configuration finale de VirtualHost, nous n'aurons réellement besoin que de 3 fichiers : SSLCertificateFile
, SSLCertificateKeyFile
et SSLCertificateChainFile
, que nous pouvons placer n'importe où sur le serveur (le nom et l'emplacement n'ont pas d'importance). Il est important de fournir un chemin de travail et que le contenu des fichiers soit valide.
La méthode spécifique d'obtention des certificats peut varier d'une AC à l'autre. L'important est de comprendre le principe et de l'appliquer ensuite à votre cas.
Fichier | Signification |
---|---|
SSLCertificateFile |
Ce certificat est envoyé par l'autorité |
SSLCertificateKeyFile |
My generated private key |
SSLCertificateChainFile |
J'ai téléchargé du web type intermédiaire + root |
Sur le serveur, nous générons d'abord la clé privée. Le mot privé est important, il signifie que personne d'autre que le serveur web ne le connaît. Idéalement, il ne devrait jamais quitter le serveur et devrait être placé dans un endroit sûr. La perte de cette clé signifie une perte de sécurité, car un attaquant sera en mesure de se faire passer pour un serveur spécifique.
Pour générer la clé, utilisez la commande :
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
Pour le générer, nous devons avoir le programme openssl
installé sur le serveur, que nous pouvons obtenir par exemple en exécutant sudo apt install openssl
.
Il peut y avoir plusieurs types de clés, dans ce cas nous générons une clé RSA de 2048 octets (rsa:2048
).
La sortie de la commande est constituée de 2 fichiers (que vous nommez en fonction de votre domaine) :
votredomaine.key
- c'est la clé privée. Enregistrez le chemin vers cette clé dans l'hôte virtuel d'Apache dans SSLCertificateKeyFile
.votredomaine.csr
- il s'agit d'une demande de certificat
, ou d'une demande d'émission d'un certificat.Le contenu de la demande doit toujours être soumis à l'AC pour approbation. Cela se fait généralement via l'interface web de l'administration du site où les certificats sont vendus. L'approbation de la demande varie en fonction du type de certificat. Elle est le plus souvent effectuée automatiquement par un robot et prend de 5 minutes à 8 heures. Dans le cas des certificats coûteux, où la propriété physique du site et de la société exploitante est également vérifiée, la vérification est effectuée manuellement et peut prendre plusieurs jours.
Si vous êtes pressé, il existe une agence de certification Let's encrypt
qui autorise les demandes automatiquement avec une validité de 3 mois.
**Note : ** Dans certains cas, l'AC offre la génération automatique de demandes. Ce n'est pas une pratique recommandée car il connaît la clé privée. Dans ce cas, vous devez toujours obtenir la clé privée de l'agence et la placer dans un fichier sur le serveur de la même manière que si vous génériez la demande.
Dans l'intervalle, en attendant que la demande soit approuvée et que le certificat soit émis, nous allons sécuriser la clé publique de l'AC. Dans Apache VirtualHost, cela est représenté par le fichier SSLCertificateChainFile
(en anglais, cela s'appelle Intermediate and Root CA
). Cette clé est en principe publique et indique au navigateur web qui est l'AC. Ce fichier est généralement téléchargé sur le site web de l'AC ou nous est transmis par courrier électronique.
Vous devez toujours télécharger la clé correcte en fonction de l'algorithme que vous choisissez. Dans le cas de RapidSSL, par exemple, il peut être téléchargé ici : https://knowledge.digicert.com/generalinformation/INFO1548….
Sur la base de cette demande, l'autorité de certification nous a délivré un certificat. Dans le cas d'Apache VirtualHost, il est représenté par le fichier SSLCertificateFile
.
Il est important de noter que le certificat a une validité limitée et que nous devons répéter ce processus (idéalement avant l'expiration). Vous pouvez facilement trouver la date d'expiration dans Chrome en cliquant sur le cadenas vert dans le navigateur et en consultant les détails du certificat, dans le cas où il est communiqué par l'AC.
Après la date d'expiration, le certificat n'est plus valide et le site refusera de se connecter et les utilisateurs recevront un message d'erreur concernant la violation de la sécurité.
L'exactitude des paramètres d'Apache peut être partiellement vérifiée avec la commande apache2ctl -S
.
Pour que les changements prennent effet, Apache doit être redémarré, par exemple avec la commande :
sudo service apache2 restart
Si aucun message d'erreur n'est émis, nous allons immédiatement vérifier la fonctionnalité via un navigateur web (je recommande Google Chrome, qui montre le plus de détails).
En cas d'erreur, nous appelons la commande apache2ctl -S
, qui peut montrer le chemin vers les logs, où nous pouvons voir approximativement ce qui ne va pas. Il est important d'effectuer toutes les étapes de ce manuel dans l'ordre correct et de ne pas intervertir les clés.
N'oubliez pas de marquer la date d'expiration sur votre calendrier afin de pouvoir renouveler votre certificat à temps. Certaines AC envoient un courriel de notification, mais ce n'est pas toujours fiable.
Vous pouvez effectuer le processus de renouvellement et obtenir un nouveau certificat en parallèle pendant que le certificat actuel est en cours d'exécution, puis le remplacer en même temps.
Pour un renouvellement automatique, je recommande [Certbot] (https://certbot.eff.org), qui peut surveiller automatiquement la validité et renouveler les certificats. Le renouvellement est effectué, par exemple, par un cron qui appelle une commande une fois par mois la nuit pour émettre un nouveau certificat et le déploie immédiatement.
Si vous ne comprenez pas la gestion des certificats, il est préférable d'être hébergé par une société établie qui vous fournira un hébergement fonctionnel, y compris un certificat. Cela vous évitera bien des tracas.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | fr