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
Il existe deux méthode pour obtenir le fameux certificat :
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
.
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).
Dans les deux cas, il nous reste deux étapes avans de configurer le serveur Apache :
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
chmod 400 /etc/ssl/certs/data.djeeks.com.crt
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
.
Afin d’ajouter un niveau de sécurisation supplémentaire à notre VirtualHost, nous allons mettre en place deux éléments importants :
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"
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.