La signature de vos propres certificats SSL est généralement une alternative facile aux autorités de certification pour les communications internes ou les sites non destinés aux utilisateurs qui ont encore besoin de chiffrement. Voici comment en configurer un avec Apache.
Générer et signer automatiquement un certificat SSL
Nous utiliserons le openssl
utilitaire pour générer le certificat et la clé privée correspondante. Vous l'avez probablement déjà installé, car il s'agit d'une dépendance d'Apache, mais s'il manque d'une manière ou d'une autre, vous pouvez l'installer à partir du gestionnaire de paquets de votre distribution. Pour les systèmes basés sur Debian comme Ubuntu, ce serait:
sudo apt-get install openssl
Après openssl
est installé, vous pouvez générer le certificat avec la commande suivante:
sudo openssl req -x509 -nodes -days 365 -newkey rsa: 2048 -keyout /etc/ssl/private/apache.key -out /etc/ssl/certs/apache.crt
openssl
vous demandera des informations sur votre organisation. Vous pouvez laisser la majeure partie de ce champ vide, mais la seule chose importante que vous devrez remplir est le "Nom commun", que vous voudrez définir sur l'adresse IP ou le nom de domaine de votre serveur.
Nom du pays (code à 2 lettres) (): Nom de l'État ou de la province (nom complet) (): Nom de la localité (par exemple, ville) (): Nom de l'organisation (par exemple, société) (): Nom de l'unité organisationnelle (par exemple, section) (): Nom commun (par exemple, nom d'hôte complet) (): votre_adresse_ip Adresse e-mail ():
openssl
prendra une seconde pour s'exécuter et générer une nouvelle clé RSA privée, qui est utilisée pour signer le certificat et le stocker dans /etc/ssl/private/apache.key
. Le certificat lui-même est stocké dans /etc/ssl/certs/apache.crt
, et sera valable un an.
Nous voulons également générer un groupe Diffie-Hellman. Ceci est utilisé pour une parfaite confidentialité secrète, qui génère des clés de session éphémères pour garantir que les communications passées ne peuvent pas être déchiffrées si la clé de session est compromise. Ce n'est pas entièrement nécessaire pour les communications internes, mais si vous voulez être aussi sécurisé que possible, vous ne devez pas ignorer cette étape. Notez que cela nécessite que vous ayez Apache version 2.4.8 ou supérieure, alors assurez-vous que vous êtes à jour.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Cela prend un certain temps – environ une heure selon la vitesse de votre serveur. Prenez un déjeuner et revenez un peu à votre terminal pour configurer Apache.
Configurer Apache pour utiliser votre certificat auto-signé
Pour vous faciliter la tâche, nous ferons toute notre configuration dans un fichier d'extrait. Créez-en un nouveau dans Apache sites disponibles
annuaire:
sudo touch /etc/apache2/conf-available/ssl-params.conf
Ouvrez-le dans votre éditeur de texte préféré et collez-le dans la configuration suivante:
SSLCipherSuite EECDH + AESGCM: EDH + AESGCM: AES256 + EECDH: AES256 + EDH SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On En-tête toujours défini X-Frame-Options DENY En-tête toujours défini X-Content-Type-Options nosniff SSLCompression désactivée SSLUseStapling sur SSLStaplingCache "shmcb: logs / stapling-cache (150000)" SSLSessionTickets Off SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
Le premier bloc définit quelques paramètres SSL par défaut, et la dernière ligne configure Apache pour utiliser le groupe Diffie-Hellman. Vous pouvez omettre cette ligne si vous avez sauté cette étape.
Ensuite, ouvrez le fichier d'hôte virtuel SSL par défaut, généralement situé à /etc/apache2/sites-available/default-ssl.conf
. Modifiez les lignes suivantes pour pointer vers votre certificat et votre fichier de clés:
SSLCertificateFile /etc/ssl/certs/apache.crt SSLCertificateKeyFile /etc/ssl/private/apache.key
SSL devrait maintenant fonctionner, mais vous devrez probablement copier une partie de la configuration de votre fichier de configuration actuel, car vous venez d'en modifier une vierge. Vous devrez vous assurer que le Nom du serveur
, ServerAdmin
, et DocumentRoot
les directives pointent vers les emplacements corrects.
De plus, vous souhaiterez configurer une redirection pour transférer le trafic HTTP vers le HTTPS chiffré. Ouvrez la configuration Apache par défaut à /etc/apache2/apache2.conf
et ajoutez les lignes suivantes pour réécrire le trafic HTTP:
RewriteEngine On RewriteCond% {SERVER_PORT} 80 RewriteRule ^ (. *) $ Https://www.votredomaine.com/\ (R, L)
Vous devez également vous assurer que votre pare-feu est ouvert. HTTPS utilise le port 443, plutôt que le port 80, vous devrez donc l'ouvrir pour vous connecter au serveur. Si vous utilisez iptables ou UFW, vous pouvez ouvrir des ports à partir de la ligne de commande. Si vous hébergez votre serveur sur un service comme AWS, votre fournisseur peut vous fournir une interface Web pour ouvrir des ports.
Les certificats auto-signés sont le plus souvent utilisés pour les serveurs privés, donc ce n'est pas une mauvaise idée de mettre en liste blanche l'accès à votre réseau local privé uniquement et d'utiliser un serveur VPN pour s'y connecter.
Une fois les ports ouverts, vous pouvez tester vos paramètres SSL en accédant à votre site dans votre navigateur. Si tout fonctionnait correctement, vous devriez voir cet avertissement:
C'est normal, alors ne vous inquiétez pas. Vous devrez sélectionner manuellement que vous faites confiance à ce certificat, raison pour laquelle vous ne pouvez pas utiliser de certificats auto-signés pour les sites accessibles au public.
L'avertissement ne signifie pas que votre site n'est pas sécurisé: SSL est toujours activé et crypte le trafic. Si votre clé privée est compromise, la communication pourrait être déchiffrée, mais elle sera parfaitement sécurisée si vous configurez le secret de diffusion Diffie-Hellman, ce qui annule ce vecteur d'attaque. Le problème ici est avec l'identité. Chrome ne peut pas vérifier que vous êtes bien qui vous dites être ou que vous êtes propriétaire du domaine, pour lequel vous aurez besoin d'une "vraie" autorité de certification.