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

introduction

TLS, ou «sécurité de la couche de transport», et son prédécesseurSSL, qui signifie «couche de sockets sécurisés», sont des protocoles Web utilisés pour envelopper le trafic normal dans un wrapper protégé et chiffré. Grâce à cette technologie, les serveurs peuvent envoyer du trafic en toute sécurité entre le serveur et le client sans craindre que les messages ne soient interceptés et lus par une partie externe. Le système de certification aide également les utilisateurs à vérifier l’identité des sites auxquels ils se connectent.

Dans ce guide, nous allons vous montrer comment configurer un certificat SSL auto-signé pour une utilisation avec un serveur Web Apache sur une machine CentOS 7.

[.Remarque]##

Note: Un certificat auto-signé cryptera 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.

Un certificat auto-signé peut être approprié si vous n'avez pas de nom de domaine associé à votre serveur et dans les cas où l'interface Web chiffrée n'est pas accessible à l'utilisateur. Si vous avez un nom de domaine, dans de nombreux cas, il est préférable d'utiliser un certificat signé par une autorité de certification. Vous pouvez découvrir comment configurer un certificat de confiance gratuit avec le projet Let’s Encrypthere.

Conditions préalables

Avant de commencer avec ce guide, vous devez d'abord suivre certaines étapes.

Vous aurez besoin d'accéder à un serveur CentOS 7 avec un utilisateur non root disposant des privilègessudo. Si vous ne l'avez pas encore configuré, vous pouvez parcourir lesCentOS 7 initial server setup guide pour créer ce compte.

Apache devra également être installé pour pouvoir configurer des hôtes virtuels. Si vous ne l’avez pas déjà fait, vous pouvez utiliseryum pour installer Apache via les référentiels logiciels par défaut de CentOS:

sudo yum install httpd

Ensuite, activez Apache en tant que service CentOS afin qu’il démarre automatiquement après un redémarrage:

sudo systemctl enable httpd.service

Une fois ces étapes terminées, vous pouvez vous connecter en tant que compte d'utilisateur non root via SSH et poursuivre le didacticiel.

Première étape: installer Mod_ssl

Afin de configurer le certificat auto-signé, nous devons d'abord nous assurer quemod_ssl, un module Apache prenant en charge le cryptage SSL, est installé sur le serveur. Nous pouvons installermod_ssl avec la commandeyum:

sudo yum install mod_ssl

Le module sera automatiquement activé pendant l'installation et Apache pourra commencer à utiliser un certificat SSL après son redémarrage. Aucune étape supplémentaire n'est nécessaire pour quemod_ssl soit prêt à être utilisé.

Deuxième étape: créer un nouveau certificat

Maintenant qu'Apache est prêt à utiliser le chiffrement, nous pouvons passer à la génération d'un nouveau certificat SSL. Le certificat stockera des informations de base sur votre site et sera accompagné d'un fichier de clé qui permettra au serveur de gérer en toute sécurité les données cryptées.

Tout d'abord, nous devons créer un nouveau répertoire pour stocker notre clé privée (le répertoire/etc/ssl/certs est déjà disponible pour contenir notre fichier de certificat):

sudo mkdir /etc/ssl/private

Les fichiers conservés dans ce répertoire devant rester strictement confidentiels, nous modifierons les autorisations pour nous assurer que seul l'utilisateur root a accès:

sudo chmod 700 /etc/ssl/private

Maintenant que nous avons un emplacement pour placer nos fichiers, nous pouvons créer la clé SSL et les fichiers de certificat avecopenssl:

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

Une fois que vous avez saisi la demande, vous serez invité à saisir des informations sur votre site Web. Avant de commencer, examinons ce qui se passe dans la commande que nous émettons:

  • 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 -x509: cela spécifie que nous voulons utiliser la gestion des demandes de signature de certificat (CSR) X.509. «X.509» est un standard d’infrastructure à clé publique auquel adhèrent SSL et TLS pour la gestion des clés et des certificats.

  • -nodes: Ceci indique à OpenSSL d'ignorer l'option pour sécuriser notre certificat avec une phrase de passe. Apache doit pouvoir lire le fichier, sans intervention de l'utilisateur, au démarrage du serveur. Un mot de passe empêcherait cela, car nous devions le saisir après chaque redémarrage.

  • -days 365: cette option définit la durée pendant laquelle le certificat sera considéré comme valide. Nous le fixons pour un an ici.

  • -newkey rsa:2048: Ceci spécifie que nous voulons générer un nouveau certificat et une nouvelle clé en même temps. Nous n'avons pas créé la clé requise pour signer le certificat lors d'une étape précédente. Nous devons donc le créer avec le certificat. La partiersa:2048 lui dit de créer une clé RSA d'une longueur de 2048 bits.

  • -keyout: Cette ligne indique à OpenSSL où placer le fichier de clé privée généré que nous créons.

  • -out: Ceci indique à OpenSSL où placer le certificat que nous créons.

Remplissez les invites de manière appropriée. La ligne la plus importante est celle qui demande lesCommon Name. Vous devez entrer le nom de domaine que vous souhaitez associer à votre serveur. Vous pouvez plutôt entrer l'adresse IP publique si vous n'avez pas de nom de domaine.

La liste complète 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) []:example.com
Email Address []:[email protected]

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

Pendant que nous utilisons OpenSSL, nous devrions également créer un groupe Diffie-Hellman fort, qui est utilisé dans la négociation dePerfect Forward Secrecy avec les clients.

Nous pouvons le faire en tapant:

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

Cela peut prendre quelques minutes, mais lorsque cela sera fait, vous aurez un groupe DH fort à/etc/ssl/certs/dhparam.pem que nous pourrons utiliser dans notre configuration.

Étant donné que la version d'Apache livrée avec CentOS 7 n'inclut pas la directiveSSLOpenSSLConfCmd, nous devrons ajouter manuellement le fichier généré à la fin de notre certificat auto-signé. Pour ce faire, tapez:

cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/apache-selfsigned.crt

Le fichierapache-selfsigned.crt doit maintenant avoir à la fois le certificat et le groupe Diffie-Hellman généré.

Troisième étape: Configurer le certificat

Nous avons maintenant tous les composants requis de l'interface finie. La prochaine étape consiste à configurer les hôtes virtuels pour qu'ils affichent le nouveau certificat.

Ouvrez le fichier de configuration SSL d’Apache dans votre éditeur de texte avec les privilèges root:

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

Trouvez la section qui commence par<VirtualHost _default_:443>. Nous devons apporter quelques modifications ici pour nous assurer que notre certificat SSL est correctement appliqué à notre site.

Ajustement des directives VirtualHost

Tout d'abord, supprimez les commentaires de la ligneDocumentRoot et modifiez l'adresse entre guillemets à l'emplacement de la racine du document de votre site. Par défaut, ce sera en/var/www/html, et vous n'avez pas besoin de changer cette ligne si vous n'avez pas changé la racine du document pour votre site. Cependant, si vous avez suivi un guide comme nosApache virtual hosts setup guide, la racine du document de votre site peut être différente.

Ensuite, supprimez le commentaire de la ligneServerName et remplacezwww.example.com par votre nom de domaine ou l'adresse IP du serveur (selon celui que vous avez mis comme nom commun dans votre certificat):

/etc/httpd/conf.d/ssl.conf


. . .
DocumentRoot "/var/www/example.com/public_html"
ServerName www.example.com:443

Ensuite, recherchez les lignesSSLProtocol etSSLCipherSuite et supprimez-les ou commentez-les. La configuration que nous allons coller dans un instant offrira des paramètres plus sécurisés que ceux par défaut fournis avec Apache de CentOS:

/etc/httpd/conf.d/ssl.conf

. . .
# SSLProtocol all -SSLv2
. . .
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

Trouvez les lignesSSLCertificateFile etSSLCertificateKeyFile et changez-les dans le répertoire que nous avons créé à/etc/httpd/ssl:

/etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

Nous en avons maintenant terminé avec les modifications dans le blocVirtualHost réel. Les prochaines modifications auront lieu après la balise de fin</VirtualHost> dans ce même fichier.

Configuration des paramètres SSL sécurisés

Ensuite, pour configurer Apache SSL de manière plus sécurisée, nous utiliserons les recommandations deRemy van Elst sur le siteCipherli.st. Ce site est conçu pour fournir des paramètres de chiffrement faciles à utiliser pour les logiciels courants. Vous pouvez en savoir plus sur ses décisions concernant les choix Apachehere.

[.Remarque]##

Note: Les paramètres suggérés sur le site lié à ci-dessus offrent une sécurité renforcée. Parfois, cela se fait au détriment d'une meilleure compatibilité client. Si vous devez prendre en charge des clients plus âgés, il existe une autre liste accessible en cliquant sur le lien de la page intitulée «Oui, donnez-moi une suite de chiffrement qui fonctionne avec les anciens / anciens logiciels». Cette liste peut être remplacée par les éléments copiés au dessous de.

Le choix de la configuration que vous utiliserez dépendra en grande partie de ce que vous devez prendre en charge. Ils offriront tous les deux une grande sécurité.

Pour nos besoins, nous pouvons copier les paramètres fournis dans leur intégralité. Nous allons juste faire deux petits changements.

Prenez un moment pour lire lesHTTP Strict Transport Security, or HSTS, et plus particulièrement les“preload” functionality. Le préchargement de HSTS offre une sécurité accrue, mais peut avoir de lourdes conséquences s'il est activé par inadvertance ou incorrectement. Dans ce guide, nous ne préchargerons pas les paramètres, mais vous pouvez le modifier si vous êtes certain de bien comprendre les implications.

L’autre changement que nous allons apporter est de mettre en commentaire la directiveSSLSessionTickets, car elle n’est pas disponible dans la version d’Apache livrée avec CentOS 7.

Collez dans les paramètres du siteAFTER la fin du blocVirtualHost:

/etc/httpd/conf.d/ssl.conf

    . . .

. . .

# Begin copied text
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
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"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# 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é ces modifications, vous pouvez enregistrer et fermer le fichier.

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

Pour rediriger tout le trafic vers le chiffrement 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 blocVirtualHost pour faire correspondre les demandes sur le port 80. À l'intérieur, utilisez la directiveServerName pour faire correspondre à nouveau votre nom de domaine ou votre adresse IP. Ensuite, utilisezRedirect pour faire correspondre toutes les requêtes et envoyez-les au SSLVirtualHost. Assurez-vous d'inclure la barre oblique finale:

/etc/apache2/sites-available/000-default.conf


        ServerName www.example.com
        Redirect "/" "https://www.example.com/"

Enregistrez et fermez ce fichier lorsque vous avez terminé.

Quatrième étape: activer le certificat

A ce jour, vous avez créé un certificat SSL et configuré votre serveur Web pour l'appliquer à votre site. Pour appliquer toutes ces modifications et commencer à utiliser votre cryptage SSL, vous pouvez redémarrer le serveur Apache pour recharger ses configurations et ses modules.

Commencez par vérifier les erreurs de syntaxe dans votre fichier de configuration en tapant:

sudo apachectl configtest

Tant que la sortie se termine parSyntax 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 essayez à nouveau:

Output. . .
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’exécutez pas de pare-feu, vous pouvez passer à l’avance.

Si vous avez un pare-feufirewalld 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 un pare-feuiptables est en cours d'exécution, les commandes que vous devez exécuter dépendent fortement de votre jeu de règles actuel. Pour un ensemble de règles de base, vous pouvez ajouter un 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

Dans votre navigateur Web, essayez de visiter votre nom de domaine ou votre adresse IP avechttps:// pour voir votre nouveau certificat en action.

https://example.com/

Votre navigateur Web vous avertira probablement que le certificat de sécurité du site n’est pas approuvé. Étant donné que votre certificat n'est pas signé par une autorité de certification approuvée par le navigateur, celui-ci ne peut pas vérifier l'identité du serveur auquel vous essayez de vous connecter. Nous avons créé un certificat auto-signé au lieu d'un certificat approuvé signé par une autorité de certification, ce qui est donc parfaitement logique.

Une fois que vous aurez ajouté une exception à la vérification de l'identité du navigateur, vous pourrez accéder à votre site nouvellement sécurisé.

Conclusion

Vous avez configuré votre serveur Apache pour gérer les requêtes HTTP et HTTPS. Cela vous aidera à communiquer avec vos clients en toute sécurité et à éviter que des tiers ne puissent lire votre trafic.

Si vous envisagez 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 montrés à chacun de vos visiteurs.