Apache et SSL

Création de la clé privée et du Certificat Signing Request

Afin de générer les certificats et les clés, il faut que openssl soit installé sur le serveur :

apt install openssl

Ensuite, on se place dans le bon dossier et on génère la clé privée :

openssl genrsa -out data.djeeks.com.key 2048 -sha256

On génère une Certificate Signing Request (CSR) qui est signée avec la clé privée que nous avons précédemment générées :

openssl req -new -key data.djeeks.com.key -out data.djeeks.com.csr

Création du certificat

Il existe deux méthode pour obtenir le fameux certificat :

  • soit on demande notre certificat à une Autorité de Certification (CA)
  • soit on génère un certificat auto-signé sur notre serveur

Demande d’un certificat auprès d’une Autorité de Certification

Le rôle de l’Autorité de Certification est de vérifier la validité des données saisies par la personne (ou société) qui émet une demande de Certificat. Les navigateurs web font confiance à certaines Autorités de Certification. Dans le cas de l’utilisation d’un certificat émis par une de ces Autorités, le navigateur donne l’accès au serveur sans aucune action du visiteur puisque les vérifications préalables ont été assurées par la CA (demande de CNI ou Kbis par exemple).

Pour obtenir un certificat des Autorités de Certification, il faut (après paiement) afficher la Certificate Signing Request : cat /etc/ssl/data.djeeks.com.csr et la coller dans l’interface web du prestataire. En retour, on obtient le certificat au format .crt qu’on pourra placer dans le dossier /etc/ssl/certs.

Création d’un certificat auto-signé

Il est également possible de créer son propre certificat sur le serveur via la commande :

openssl x509 -req -days 365 -in data.djeeks.com.csr -signkey data.djeeks.com.key -out data.djeeks.com.crt

Dans ce cas, lors d’un accès au serveur via le protocole HTTPS, le navigateur nous signalera qu’il ne connait pas la source ayant émis le certificat (celui-ci n’est pas signé par une Autorité de Certification qu’il connait). Par défaut, il ne fait donc pas confiance aux informations contenues dans ce certificat et afin de préserver tout risque bloque la page. C’est donc à l’utilisateur d’ajouter une exception dans la politique de sécurité du navigateur pour forcer l’accès à la page (si l’utilisateur à confiance en ce certificat).

Manipulations préalables à la configuration d’Apache

Dans les deux cas, il nous reste deux étapes avans de configurer le serveur Apache :

  • On place le certificat et la clé dans les bons dossiers :
mv /etc/ssl/data.djeeks.com.key /etc/ssl/private/data.djeeks.com.key
mv /etc/ssl/data.djeeks.com.crt /etc/ssl/certs/data.djeeks.com.crt
  • La clé que nous avons sur le serveur est une clé privée. Cela signifie qu’afin de garantir la sécurité des connexion, personne ne doit pouvoir l’afficher. Il faut donc absolument restreindre son accès :
chmod 400 /etc/ssl/certs/data.djeeks.com.crt

Configuration d’Apache

Pour qu’Apache soit capable d’utiliser des connexions chiffrées par les certificats SSL, il faut activer le mode SSL :

a2enmod ssl

Ensuite, on modifie le virtualhost existant (ou on en crée un nouveau). Ce virtualhost contiendra les informations suivantes en plus de la configuration classique :

SSLEngine On
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire

SSLCertificateFile /etc/ssl/certs/data.djeeks.com.crt
SSLCertificateChainFile /etc/ssl/certs/data.djeeks.com_bundle.crt
SSLCertificateKeyFile /etc/ssl/private/data.djeeks.com.key

Si on souhaite forcer l’utilisation du protocole HTTPS au lieu de HTTP, il faut ajouter ces lignes au début du VirtualHost :

<VirtualHost *:80>
		ServerName data.djeeks.com

		RewriteEngine On
		RewriteCond %{SERVER_PORT} !^443$
		RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

		#RewriteCond %{HTTPS} off
		#RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
</virtualHost>

On active ce virtalhost (si ce n’était pas déjà fait) : a2ensite data.djeeks.com.conf

On vérifie que la configuration Apache est bonne : apachectl configtest et s’il n’y a pas de souci on peut redémarrer Apache : systemctl restart apache2.service.

Sécurisation avancée

Afin d’ajouter un niveau de sécurisation supplémentaire à notre VirtualHost, nous allons mettre en place deux éléments importants :

  • HTTP avec Strict Transport Security (HSTS)
  • Forward Secrecy

HTTP avec Strict Transport Security

Afin d’ajouter le support du HSTS, voila la ligne à ajouter dans les vhosts Apache :

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Forward Secrecy

Afin d’ajouter le Forward Secrecy, il faut ajouter les lignes suivantes dans les vhosts Apache :

SSLProtocol TLSv1.2
SSLHonorCipherOrder on
SSLCipherSuite "ECDH+AES256:ECDH+SHA384"

Pour vérifier que tout est bien configuré, on peut utilise l’outil de SSL Labs.