Comment créer un certificat SSL auto-signé pour Apache dans Ubuntu 16.04

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 les clients sans que les messages puissent être interceptés par des tiers. 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 un serveur Ubuntu 16.04.

[.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 vousdo 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, vous devez avoir un utilisateur non root configuré avec les privilègessudo. Vous pouvez apprendre comment configurer un tel compte utilisateur en suivant nosinitial server setup for Ubuntu 16.04.

Le serveur Web Apache devra également être installé. Si vous souhaitez installer une pile LAMP (Linux, Apache, MySQL, PHP) entière sur votre serveur, vous pouvez suivre notre guide sursetting up LAMP on Ubuntu 16.04. Si vous souhaitez uniquement utiliser le serveur Web Apache, ignorez les étapes relatives à PHP et MySQL décrites dans le guide.

Lorsque vous avez terminé les conditions préalables, continuez ci-dessous.

Étape 1: Créer le certificat SSL

TLS/SSL works by using a combination of a public certificate and a private key. La clé SSL est gardée secrète sur le serveur. Il est utilisé 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.

Nous pouvons créer une paire de clés et de certificats auto-signée avec OpenSSL en une seule commande:

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 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: cette sous-commande spécifie que nous voulons utiliser la gestion des demandes de signature de certificat (CSR) X.509. «X.509» est une norme d'infrastructure à clé publique à laquelle SSL et TLS adhèrent pour la gestion de ses clés et de ses certificats. Nous voulons créer un nouveau certificat X.509, nous utilisons donc cette sous-commande.

  • -x509: Cela modifie encore la sous-commande précédente en indiquant à l'utilitaire que nous voulons créer un certificat auto-signé au lieu de générer une demande de signature de certificat, comme cela se produirait normalement.

  • -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.

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

Remplissez les invites de manière appropriée. The most important line is the one that requests the Common Name (e.g. server FQDN or YOUR name). You need to enter the domain name associated with your server or, more likely, your server’s public IP address.

L'intégralité des invites ressemblera à ceci:

OutputCountry Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

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.

Étape 2: Configurer Apache pour utiliser SSL

Nous avons créé nos fichiers de clé et de certificat dans le répertoire/etc/ssl. Il ne nous reste plus qu'à modifier notre configuration Apache pour en tirer parti.

Nous allons faire quelques ajustements à notre configuration:

  1. Nous allons créer un extrait de configuration pour spécifier les paramètres SSL forts par défaut.

  2. Nous allons modifier le fichier d'hôte virtuel Apache SSL inclus pour qu'il pointe vers nos certificats SSL générés.

  3. (Recommandé) Nous allons modifier le fichier d'hôte virtuel non crypté pour rediriger automatiquement les demandes vers l'hôte virtuel crypté.

Lorsque nous aurons terminé, nous devrions avoir une configuration SSL sécurisée.

Créer un extrait de configuration Apache avec des paramètres de cryptage fort

Tout d'abord, nous allons créer un extrait de configuration Apache pour définir certains paramètres SSL. Cela configurera Apache avec une suite de chiffrement SSL puissante et activera certaines fonctionnalités avancées qui contribueront à maintenir la sécurité de notre serveur. Les paramètres que nous définirons peuvent être utilisés par tout hôte virtuel activant SSL.

Créez un nouvel extrait de code dans le répertoire/etc/apache2/conf-available. Nous nommerons le fichierssl-params.conf pour préciser son objectif:

sudo nano /etc/apache2/conf-available/ssl-params.conf

Pour configurer Apache SSL en toute sécurité, 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]##

Les paramètres suggérés sur le site lié à ci-dessus offrent une sécurité élevé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.

Définissez la directiveSSLOpenSSLConfCmd DHParameters pour qu'elle pointe vers le fichier Diffie-Hellman que nous avons généré précédemment. Aussi, 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 comprendre les implications:

/etc/apache2/conf-available/ssl-params.conf

# 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
SSLSessionTickets Off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

Enregistrez et fermez le fichier lorsque vous avez terminé.

Modifier le fichier d'hôte virtuel SSL Apache par défaut

Ensuite, modifions/etc/apache2/sites-available/default-ssl.conf, le fichier hôte virtuel SSL Apache par défaut. Si vous utilisez un fichier de bloc de serveur différent, remplacez-le par le nom ci-dessous.

Avant d’aller plus loin, sauvegardons le fichier d’hôte virtuel SSL original:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Ouvrez maintenant le fichier SSL Virtual Host pour procéder aux ajustements suivants:

sudo nano /etc/apache2/sites-available/default-ssl.conf

A l'intérieur, avec la plupart des commentaires supprimés, le fichier d'hôte virtuel devrait ressembler à ceci par défaut:

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


        
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

        

Nous apporterons quelques ajustements mineurs au dossier. Nous allons définir les éléments normaux que nous souhaiterions ajuster dans un fichier d'hôte virtuel (adresse électronique ServerAdmin, NomServeur, etc.), ajuster les directives SSL pour qu'elles pointent sur notre certificat et nos fichiers de clés, et supprimer la mise en commentaire d'une section assurant la compatibilité avec les versions antérieures. navigateurs.

Après avoir apporté ces modifications, votre bloc serveur devrait ressembler à ceci:

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


        
                ServerAdmin [email protected]
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

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

                
                                SSLOptions +StdEnvVars
                
                
                                SSLOptions +StdEnvVars
                

                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0

        

Enregistrez et fermez le fichier lorsque vous avez terminé.

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 ajuster le fichier d'hôte virtuel non chiffré afin de rediriger tout le trafic vers le chiffrement SSL, nous pouvons ouvrir le fichier/etc/apache2/sites-available/000-default.conf:

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

À l'intérieur, dans les blocs de configurationVirtualHost, il suffit d'ajouter une directiveRedirect, pointant tout le trafic vers la version SSL du site:

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


        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .

Enregistrez et fermez le fichier lorsque vous avez terminé.

Étape 3: Ajustez le pare-feu

Si le pare-feu deufw est activé, comme recommandé par les guides des prérequis, vous devrez peut-être ajuster les paramètres pour autoriser le trafic SSL. Heureusement, Apache enregistre quelques profils avecufw lors de l'installation.

Nous pouvons voir les profils disponibles en tapant:

sudo ufw app list

Vous devriez voir une liste comme celle-ci:

OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

Vous pouvez voir le réglage actuel en tapant:

sudo ufw status

Si vous avez autorisé uniquement le trafic HTTP normal auparavant, votre sortie pourrait ressembler à ceci:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

Pour ajouter du trafic HTTPS, nous pouvons autoriser le profil «Apache Full», puis supprimer le profil redondant «Apache»:

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

Votre statut devrait ressembler à ceci maintenant:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

Étape 4: Activer les modifications dans Apache

Maintenant que nous avons apporté nos modifications et ajusté notre pare-feu, nous pouvons activer les modules SSL et les en-têtes dans Apache, activer notre hôte virtuel compatible SSL et redémarrer Apache.

Nous pouvons activermod_ssl, le module SSL Apache etmod_headers, nécessaires à certains des paramètres de notre extrait de code SSL, avec la commandea2enmod:

sudo a2enmod ssl
sudo a2enmod headers

Ensuite, nous pouvons activer notre hôte virtuel SSL avec la commandea2ensite:

sudo a2ensite default-ssl

Nous devrons également activer notre fichierssl-params.conf, pour lire les valeurs que nous avons définies:

sudo a2enconf ssl-params

À ce stade, notre site et les modules nécessaires sont activés. Nous devrions vérifier que nos fichiers ne contiennent aucune erreur de syntaxe. Nous pouvons le faire en tapant:

sudo apache2ctl configtest

Si tout réussit, vous obtiendrez un résultat qui ressemble à ceci:

OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

La première ligne est juste un message vous indiquant que la directiveServerName n'est pas définie globalement. Si vous souhaitez vous débarrasser de ce message, vous pouvez définirServerName sur le nom de domaine ou l’adresse IP de votre serveur dans/etc/apache2/apache2.conf. Ceci est facultatif car le message ne fera aucun mal.

Si votre sortie contientSyntax OK, votre fichier de configuration ne contient aucune erreur de syntaxe. Nous pouvons redémarrer Apache en toute sécurité pour implémenter nos modifications:

sudo systemctl restart apache2

Étape 5: Testez le cryptage

Nous sommes maintenant prêts à tester votre serveur SSL.

Ouvrez votre navigateur Web et saisissezhttps:// suivi du nom de domaine ou de l'adresse IP de votre serveur dans la barre d'adresse:

https://server_domain_or_IP

Comme le certificat que nous avons 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:

Apache self-signed cert warning

Ceci est prévu et normal. Nous ne sommes intéressés que par l’aspect cryptage de notre certificat, et non par la validation par un tiers de l’authenticité de notre hôte. Cliquez sur «ADVANCED» (Avancé), puis sur le lien fourni pour tout de même accéder à votre hôte:

Apache self-signed override

Vous devriez être pris sur votre site. Si vous regardez dans la barre d'adresse du navigateur, vous verrez un verrou avec un «x» dessus. Dans ce cas, cela signifie simplement que le certificat ne peut pas être validé. Il crypte toujours votre connexion.

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

http://server_domain_or_IP

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

Étape 6: passage à une redirection permanente

Si votre redirection fonctionne correctement et que vous êtes sûr de vouloir autoriser uniquement le trafic chiffré, vous devez modifier à nouveau l'hôte virtuel Apache non chiffré pour rendre la redirection permanente.

Ouvrez à nouveau votre fichier de configuration de bloc de serveur:

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

Trouvez la ligneRedirect que nous avons ajoutée précédemment. Ajoutezpermanent à cette ligne, ce qui change la redirection d'une redirection temporaire 302 en une redirection permanente 301:

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


        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .

Enregistrez et fermez le fichier.

Vérifiez votre configuration pour les erreurs de syntaxe:

sudo apache2ctl configtest

Lorsque vous êtes prêt, redémarrez Apache pour rendre la redirection permanente:

sudo systemctl restart apache2

Conclusion

Vous avez configuré votre serveur Apache pour utiliser un cryptage fort pour les connexions client. Cela vous permettra de répondre aux demandes en toute sécurité et empêchera des tiers de lire votre trafic.

Related