Recherche de site Web

Comment créer un certificat SSL sur Apache pour CentOS 7


Vous n'utilisez pas CentOS 7 ?Choisissez une version ou une distribution différente.

Introduction

TLS, ou sécurité de la couche de transport, et son prédécesseur SSL, qui signifie couche de sockets sécurisée, sont des protocoles web utilisés pour envelopper le trafic normal dans un emballage protégé et chiffré.

En utilisant cette technologie, les serveurs peuvent envoyer le trafic en toute sécurité entre le serveur et les clients sans possibilité que les messages soient interceptés par des tiers. Le système de certificats aide également les utilisateurs à vérifier l'identité des sites avec lesquels ils se connectent.

Dans ce guide, vous allez configurer un certificat SSL auto-signé pour être utilisé avec un serveur web Apache sur un serveur CentOS 7.

Remarque : Un certificat auto-signé chiffrera la communication entre votre serveur et tous les clients. Cependant, comme il n'est signé par aucune des autorités de certification de confiance incluses dans les navigateurs web, les utilisateurs ne peuvent pas utiliser le certificat pour valider automatiquement l'identité de votre serveur. En conséquence, les utilisateurs verront une erreur de sécurité en visitant votre site.

En raison de cette limitation, les certificats auto-signés ne sont pas appropriés pour un environnement de production destiné au public. Ils sont généralement utilisés pour les tests, ou pour sécuriser des services non critiques utilisés par un seul utilisateur ou un petit groupe d'utilisateurs qui peuvent établir la confiance dans la validité du certificat par des moyens de communication alternatifs.

Pour une solution de certificat plus prête pour la production, consultez Let’s Encrypt, une autorité de certification gratuite. Vous pouvez apprendre à télécharger et configurer un certificat Let’s Encrypt dans votre tutoriel sur la configuration d’Apache avec un certificat Let’s Encrypt sur CentOS 7.

Prérequis

Avant de commencer avec ce guide, il y a quelques étapes qui doivent être complétées en premier.

  • Vous aurez besoin d'un accès à un serveur CentOS 7 avec un utilisateur non-root disposant des privilèges sudo. Si vous ne l’avez pas encore configuré, vous pouvez suivre le guide de configuration initiale du serveur CentOS 7 pour créer ce compte.
  • Vous devrez également avoir Apache installé comme décrit à l'étape 1 du tutoriel Comment installer le serveur Web Apache sur CentOS 7. Une fois ces étapes terminées, vous pouvez vous connecter avec votre compte utilisateur non root via SSH et continuer avec le tutoriel.

Étape 1 — Installation de mod_ssl

Pour configurer le certificat auto-signé, vous devez d'abord vous assurer que mod_ssl, un module Apache qui fournit le support du chiffrement SSL, est installé sur le serveur. Vous pouvez installer mod_ssl avec la commande yum :

sudo yum install mod_ssl

Le module sera automatiquement activé lors de l'installation, et Apache pourra commencer à utiliser un certificat SSL après son redémarrage. Vous n'avez pas besoin de prendre d'étapes supplémentaires pour que mod_ssl soit prêt à l'emploi.

Étape 2 — Création d'un nouveau certificat

Maintenant qu'Apache est prêt à utiliser le chiffrement, vous pouvez passer à la génération d'un nouveau certificat SSL. TLS/SSL fonctionne en utilisant une combinaison d'un certificat public et d'une clé privée. La clé SSL est gardée secrète sur le serveur. Elle est utilisée pour chiffrer le contenu envoyé aux clients. Le certificat SSL est partagé publiquement avec toute personne demandant le contenu. Il peut être utilisé pour déchiffrer le contenu signé par la clé SSL associée.

Le répertoire /etc/ssl/certs, qui peut être utilisé pour contenir le certificat public, devrait déjà exister sur le serveur. Vous devrez également créer un répertoire /etc/ssl/private, pour contenir le fichier de clé privée. Puisque la confidentialité de cette clé est essentielle pour la sécurité, il est important de verrouiller les permissions pour empêcher tout accès non autorisé :

sudo mkdir /etc/ssl/private

sudo chmod 700 /etc/ssl/private

Maintenant, vous pouvez créer une paire de clé et certificat auto-signés avec OpenSSL en une seule commande en tapant :

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

On vous posera une série de questions. Avant de passer à cela, examinons ce qui se passe dans la commande :

  • openssl : Il s'agit de l'outil de ligne de commande de base pour créer et gérer les certificats, clés et autres fichiers OpenSSL.
  • req : Cette sous-commande spécifie que vous souhaitez utiliser la gestion des demandes de signature de certificat (CSR) X.509. Le « X.509 » est une norme d'infrastructure à clé publique à laquelle SSL et TLS adhèrent pour la gestion de leurs clés et certificats. Vous voulez créer un nouveau certificat X.509, donc vous utilisez cette sous-commande.
  • -x509 : Cela modifie davantage la sous-commande précédente en indiquant à l'utilitaire que vous voulez créer un certificat auto-signé au lieu de générer une demande de signature de certificat, comme cela se produirait normalement.
  • -nodes : Cela indique à OpenSSL de passer l'option pour sécuriser votre certificat avec une phrase de passe. Vous avez besoin qu'Apache puisse lire le fichier, sans intervention de l'utilisateur, au démarrage du serveur. Une phrase de passe empêcherait cela car vous devriez la saisir après chaque redémarrage.
  • -jours 365 : Cette option définit la durée pendant laquelle le certificat sera considéré comme valide. Vous le définissez ici pour un an.
  • -newkey rsa:2048 : Cela spécifie que vous souhaitez générer un nouveau certificat et une nouvelle clé en même temps. Vous n'avez pas créé la clé requise pour signer le certificat à l'étape précédente, donc vous devez la créer en même temps que le certificat. La partie rsa:2048 indique de créer une clé RSA de 2048 bits.
  • -keyout : Cette ligne indique à OpenSSL où placer le fichier de clé privée généré que vous êtes en train de créer.
  • -out : Cela indique à OpenSSL où placer le certificat que vous êtes en train de créer.

Comme indiqué ci-dessus, ces options créeront à la fois un fichier de clé et un certificat. On vous posera quelques questions sur votre serveur afin d'intégrer correctement les informations dans le certificat.

Remplissez correctement les champs.

Remarque : Il est important que vous saisissiez le nom de votre domaine ou l'adresse IP publique de votre serveur lorsque vous êtes invité à entrer le Nom commun (par exemple FQDN du serveur ou VOTRE nom). La valeur ici doit correspondre à la manière dont vos utilisateurs accèdent à votre serveur.

L'ensemble des invites ressemblera à ceci :

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com

Les deux fichiers que vous avez créés seront placés dans les sous-répertoires appropriés du répertoire /etc/ssl.

Comme vous utilisez OpenSSL, vous devriez également créer un groupe Diffie-Hellman solide, qui est utilisé pour négocier la confidentialité persistante parfaite avec les clients.

Vous pouvez faire cela en tapant :

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Cela peut prendre quelques minutes, mais une fois terminé, vous aurez un groupe DH solide dans /etc/ssl/certs/dhparam.pem que vous pourrez utiliser dans votre configuration.

Étape 3 — Configuration du certificat

Vous avez maintenant tous les composants nécessaires de l'interface terminée. La prochaine étape consiste à configurer les hôtes virtuels pour afficher le nouveau certificat.

Ouvrez un nouveau fichier dans le répertoire /etc/httpd/conf.d :

sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf

Collez la configuration VirtualHost minimale suivante :

<VirtualHost *:443>
    ServerName your_domain_or_ip
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

Assurez-vous de mettre à jour la ligne ServerName en fonction de la façon dont vous avez l'intention d'adresser votre serveur. Il peut s'agir d'un nom d'hôte, d'un nom de domaine complet ou d'une adresse IP. Assurez-vous que ce que vous choisissez correspond au Nom commun que vous avez choisi lors de la création du certificat.

Configuration des paramètres SSL sécurisés

Ensuite, vous ajouterez quelques options SSL supplémentaires qui augmenteront la sécurité de votre site. Les options que vous utiliserez sont des recommandations de Cipherlist.eu. Ce site est conçu pour fournir des paramètres de chiffrement faciles à utiliser pour les logiciels populaires.

Remarque : Les paramètres suggérés par défaut sur Cipherlist.eu offrent une sécurité renforcée. Parfois, cela se fait au détriment d'une plus grande compatibilité avec les clients. Si vous devez prendre en charge des clients plus anciens, il existe une liste alternative à laquelle vous pouvez accéder en cliquant sur le lien intitulé « Oui, donnez-moi une suite de chiffrement qui fonctionne avec les logiciels anciens/hérités. »

La liste de compatibilité peut être utilisée à la place des suggestions par défaut dans la configuration ci-dessus entre les deux blocs de commentaires. Le choix de la configuration que vous utilisez dépendra en grande partie de ce que vous devez prendre en charge.

Il y a quelques parties de la configuration que vous pourriez souhaiter modifier. Tout d'abord, vous pouvez ajouter votre résolveur DNS préféré pour les requêtes en amont à la directive resolver. Vous avez utilisé celui de Google pour ce guide, mais vous pouvez le changer si vous avez d'autres préférences.

Enfin, vous devriez prendre un moment pour vous renseigner sur HTTP Strict Transport Security, ou HSTS, et plus précisément sur la fonctionnalité « preload ». Le préchargement de HSTS offre une sécurité accrue, mais peut avoir des conséquences importantes s'il est activé par erreur ou activé de manière incorrecte. Dans ce guide, vous ne préchargerez pas les paramètres, mais vous pouvez modifier cela si vous êtes sûr de comprendre les implications.

Les autres modifications que vous effectuerez consistent à supprimer +TLSv1.3 et à commenter les directives SSLSessionTickets et SSLOpenSSLConfCmd, car elles ne sont pas disponibles dans la version d'Apache livrée avec CentOS 7.

Collez dans les paramètres du site après la fin du bloc VirtualHost :

    . . .
</VirtualHost>
. . .

# Begin copied text
# from https://cipherli.st/

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.2
# SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off

Lorsque vous avez terminé de faire ces modifications, vous pouvez enregistrer et fermer le fichier.

Créer une redirection de HTTP vers HTTPS (Optionnel)

En l'état actuel, le serveur fournira à la fois du trafic HTTP non chiffré et du trafic HTTPS chiffré. Pour une meilleure sécurité, il est recommandé dans la plupart des cas de rediriger automatiquement le HTTP vers le HTTPS. Si vous ne souhaitez pas ou n'avez pas besoin de cette fonctionnalité, vous pouvez passer cette section en toute sécurité.

Pour rediriger tout le trafic afin qu'il soit chiffré en SSL, créez et ouvrez un fichier se terminant par .conf dans le répertoire /etc/httpd/conf.d :

sudo vi /etc/httpd/conf.d/non-ssl.conf

À l'intérieur, créez un bloc VirtualHost pour correspondre aux requêtes sur le port 80. À l'intérieur, utilisez la directive ServerName pour correspondre à nouveau à votre nom de domaine ou à votre adresse IP. Ensuite, utilisez Redirect pour correspondre à toutes les requêtes et les envoyer vers le VirtualHost SSL. Assurez-vous d'inclure la barre oblique finale :

<VirtualHost *:80>
       ServerName your_domain_or_ip
        Redirect "/" "https://your_domain_or_ip/"
</VirtualHost>

Enregistrez et fermez ce fichier lorsque vous avez terminé.

Étape 4 — Application des modifications de configuration d'Apache

À présent, vous avez créé un certificat SSL et configuré votre serveur web pour l'appliquer à votre site. Pour appliquer tous ces changements et commencer à utiliser votre chiffrement SSL, vous pouvez redémarrer le serveur Apache afin de recharger ses configurations et modules.

Tout d'abord, vérifiez votre fichier de configuration pour des erreurs de syntaxe en tapant :

sudo apachectl configtest

Tant que la sortie se termine par Syntax OK, vous pouvez continuer en toute sécurité. Si cela ne fait pas partie de votre sortie, vérifiez la syntaxe de vos fichiers et réessayez :

. . .
Syntax OK

Redémarrez le serveur Apache pour appliquer vos modifications en tapant :

sudo systemctl restart httpd.service

Ensuite, assurez-vous que les ports 80 et 443 sont ouverts dans votre pare-feu. Si vous n'utilisez pas de pare-feu, vous pouvez passer cette étape.

Si vous avez un pare-feu firewalld en cours d'exécution, vous pouvez ouvrir ces ports en tapant :

sudo firewall-cmd --add-service=http

sudo firewall-cmd --add-service=https

sudo firewall-cmd --runtime-to-permanent

Si vous avez le pare-feu iptables en cours d'exécution, les commandes que vous devez exécuter dépendent fortement de votre ensemble de règles actuel. Pour un ensemble de règles de base, vous pouvez ajouter l'accès HTTP et HTTPS en tapant :

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Étape 5 — Test de chiffrement

Maintenant, vous êtes prêt à tester votre serveur SSL.

Ouvrez votre navigateur web et tapez https:// suivi du nom de domaine ou de l’IP de votre serveur dans la barre d’adresse :

https://your_domain_or_ip

Parce que le certificat que vous avez créé n’est pas signé par l’une des autorités de certification de confiance de votre navigateur, vous verrez probablement un avertissement inquiétant comme celui ci-dessous :

Ceci est attendu et normal. Vous vous intéressez seulement à l'aspect chiffrement de votre certificat, et non à la validation par un tiers de l'authenticité de votre hôte. Cliquez sur « AVANCÉ » puis sur le lien fourni pour continuer vers votre hôte quand même :

Vous devriez être dirigé vers votre site. Si vous regardez dans la barre d'adresse du navigateur, vous verrez une indication de sécurité partielle. Cela pourrait être un cadenas avec un "x" dessus ou un triangle avec un point d'exclamation. Dans ce cas, cela signifie simplement que le certificat ne peut pas être validé. Il chiffre toujours votre connexion.

Si vous avez configuré Apache pour rediriger les requêtes HTTP vers HTTPS, vous pouvez également vérifier si la redirection fonctionne correctement :

http://your_domain_or_ip

Si cela donne la même icône, cela signifie que votre redirection a fonctionné correctement.

Conclusion

Vous avez configuré votre serveur Apache pour gérer à la fois les requêtes HTTP et HTTPS. Cela vous aidera à communiquer avec les clients de manière sécurisée et à empêcher des parties extérieures de pouvoir lire votre trafic.

Si vous prévoyez d'utiliser SSL pour un site Web public, vous devriez probablement acheter un certificat SSL auprès d'une autorité de certification de confiance pour éviter que les avertissements effrayants ne soient affichés à chacun de vos visiteurs.