I Introduction
L’objectif est de montrer les premières étapes principales afin de mettre en œuvre une communication HTTPS avec un serveur Apache.
Pré-requis :
- Apache déjà installé
II Module SSL pour Apache
Avant de mettre en place le mode de communication sécurisé en « https », il faut s’assurer que le module SSL soit actif dans Apache car c’est grâce à ce dernier qu’il sera possible d’utiliser le protocole TLS.
Activer le module SSL :
a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
service apache2 restart
puis lancer le service apache :
systemctl restart apache2.service
Enfin vérifier que le module soit chargé par apache :
apachectl -M | grep ssl
ssl_module (shared)
III Certificats
III.1 Introduction (petite)
Dans le cadre du chiffrement des données entre 2 machines via TLS, il est nécessaire de s’authentifier et de s’assurer que le serveur est bien celui qui dit l’être. Pour cela il est utiliser le principe des certificats.
Le certificat (dans les grandes lignes) fournit :
- des éléments d’identité ;
- l’authentification du serveur ;
- une clef publique qui sera utilisée dans cadre du chiffrement entre le client et le serveur ;
- peut être vérifié par une autorité de certification tierce.
Pour en savoir plus sur le protocole TLS : lien wiki
Maintenant deux possibilités s’offrent à nous avant de continuer. Soit on crée un certificat via une autorité de certification (organisme gratuit : CA CERT ou Let’s Encrypt) soit on crée un certificat auto-signé (les navigateurs web vont un peu crier et indiquer que la communication n’est pas sure car il n’y a pas d’autorité tierce de certification qui certifiera que le serveur c’est bien le bon serveur …)
Nous allons prendre le dernier cas, l’idée initiale étant d’activer le https et non d’être dans l’état de l’art à ce stade.
III.2 Création d’un certificat auto signé
III.2.1 Création d’une clef privée
Génération d’une clef :
openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..................................................+++++
......+++++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
La clef ressemblera à ceci :
cat server.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,F4BD099F3D84CEE1
WGX0CXxF9XH1Tz1Ehs/RkYsIzv30t0EmVGM5wqJcj6mrL6H9GcrDTmKFRr2Nc/Cd
fScu5cizm1q0+pzAptOl51LMPvW/8qI6wdaTo/vQGHHwigw1EJgvi3ryns17MQMK
mMWpuWXS6muYCai+YrhSN/8AmqKbFqoq5NdEPwjtww0UiGNEkQ1zMzNaQomFXgqN
7bQQ1mnJLFzgz2/ljEVjtyZJ/A09I7+lNkWEztvTxOy6Kk4GKWmbUrf/fdC++Uan
5eKaU4ujn9tc1ycFssoPIqIgAAZpr+ZabS3LC8qtlHeHSpfmBBntgu+8bnapNuLB
WNllQs4AWX4GQienJwXnYURT4G6GIVR/yiFQkvkY8cRkyAI4aNNkgXLOus4vzkUf
QzX/1loSgPAd/nd8NVuKaYeypT6lBEGPmYPE5u/OoToDD8slEl1UwrdRd0sgx0Du
CmycQic6Kip/YO/sTLCCD0cDmQ3aCRHghc/wPtLv2gyZwJQ1lXIEavAcSt96ZzMQ
QF/9ML2dVIHHaMaHv1sRVL4b3JAbSvjgS/N2vEKTE3LGN1Uutm+eklU44umQPh3b
dLBUjUHutiJGfUSsID2UimG66A1pZC6dgAedWny9ZMZnvkSh21aJUboCz7NZwHu3
6PjoFrYKbeMdky5PjYpwziCDkLBpLQ2ahRv27IYXhbKemuEaV5TT9M68vhmxfuqF
DV/K/ux6pwgtkR7EZkyXtPOKYJ0/ZpwvtTAy7PQt8SCsVZy3LB5ky0K0R6oJn5+S
qfw9sorAEXScyyj5YMxoZWpXjcBmRIc4vY487OeIMcWxcoXCwwqMvqzx+BE1luZd
h7MO6ZUzJ3jUBSuwy1Hr4+nAWQDOlLi5QS8lMqt4qVOdIb6Xvsqhzgc3FXPs/L4r
GBdQiJ7WeKz7SZSWINTX/q0vEqLRnMwLmYaDfWuP+NNdKKiDMbG5+qBy9qrmLopL
7YTwPv8+z0DPqauGwyJUPRRTvoMo4yLpNwPEV8jqZcS7S9l4BSnLd2eJYIwOW7lR
JMQhoR1gE9mRvg67g/ZV9dMfnkBWt2EAIrPw3IK283wagKJ+Z2Tp1ITalyHZ4PVg
SwhnVZsXpO0SC6UwEwoSOmWMzRrCwnj5mi+sR5xJdbUCEjtsWI7BpdS6RnFnUzRw
BdsL6/DerrfygBjGK6sFSDIOWDgUxaWRN/RTOfYUwbyxPI7cBRo0kHkgOoyQSd86
awhOrn1T7NTRbyBvLcKQNdGc+KnJhr95T9RR8Ww846S3F1zVugl9K+UN4+HXbdlI
C6pqAIwGcqtd5C+bbqLg4U1rlX4bpxyeYL8fI9xSI3a02CPl+5fQ6xEci5b1ufiw
Jg/Zl0FQHGwUHMvOJA//wGER6BoWF9uiEuMXCwVcfJLPQ2G1O+Pk8xakFfgAlrgq
OpnN6J2kM8+sX8fa0aycRKtAoRtWjLQCtxvCyh4EgkLsNfPtRitqEEyHIKzngpoS
Wlqj3iOcNb6AXwO8BuRZYAQFndvfoN+VM2V+HbcK60nDoeSkwuoYHDgMCrt1jIIk
YacqjiBsYxzupXVTFMZyqgAkQiVStWd5JgMwMEUPVM/XDhuxEHugzg94d7lmmkVU
-----END RSA PRIVATE KEY-----
Cette clef demande un passphrase. Ce qui va être gênant par la suite car le serveur apache demandera ce passphrase à son lancement pour utiliser la clef dans le chiffrement TLS.
Nous allons donc créer une clef privée sans passphrase à partir de la clef privée initiale :
openssl rsa -in server.key -out server.key.insecure
Ensuite on remplace la clef initiale par la nouvelle :
mv server.key server.key.secure
mv server.key.insecure server.key
La nouvelle clef sans passphrase ressemblera à celle ci :
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA59sAK0bBXpPvnBsmFCjfPklDOcdNaSTwtwVZQYODxB18T7Yb
kZt0xIB/6zXbxu02RwFeV9zni6xdN999YOojs20g/0cEoANiHfAYtf7NiY4n5sAZ
+CDpLXoWFrFxrUKlYI2/xon6eMISr80XPtAGQkbdT2LAmDPM7DnYQ2ypof+CT8Jr
5X/LXMd9XDA5IzNp2Ox2xIe9PM2GDd2mHKmRpoMZMyxydCrKsIqblDY63vtHWwT4
mZ8D8gRpIG4kcxGiLOPrEyAT8LESCKzygk8MyZNkB78cRqJbA3LL3wgcdTqHjXcy
n3/3WFxE9yyXOD6kuQflg4+IuSTqWrwaVU4NrQIDAQABAoIBAQCvANuYzrhIJguW
3dsZHlybC/uFEg05DtvumUfsrlL35XWeSQt4FUnGxGNJa4avGP9+CudmFGRlRb26
3aMqUrCNzxI3/Sfdi5A0nrRYMrJ7YGR3xIoVguneHKeti1QNfh+LyJJ3TlBTc9Fd
BsXD8Iq43fpP4G8Uswy7RVIaWluT3PNLDCTWDqwyRVqZT9bJN2HQlpByoj5yi6Aj
wmS8AH2EGczr4eZEkiXNWctsil1ou3iD6HBp9r5wjyHG5gIXrHD1zVOsRrRVGJ3l
dXqLvXDdUBZf7QWXFrFDl+9NbfEsCe42w3CrPQ/8F5Ta0cl3pHVkNTQa+iXJTEWb
Y6Xh7Y7hAoGBAPuLqO4xZf9YCrj9tzWSqf2nUujygaydJ1Cpjc55Cz7lbMIAZrbD
YQXIKvpgHJlLi9JyK6u90pBOuuIn85Wkg1XHRLwGjNkapwK64Ky7sxQtNep/V9W0
YyJ15BDN8c/GcKa78pMJA4UR3kidQShUNd5d3/SqKxZDYtrLjHVuV3GlAoGBAOv2
FD53lGku9sFnx9N3X9Bqi59LwW0gK0Ixdo4iWhn9bZaxsGp2wcGOijeiL/eqESdL
reJTYA+YWWCE2zRCM9qap8r1UOLeoAqVcOZYN8Q0AhU49RaONXgU8wFb8dO38BB/
s1ESZYOZ3HQaQF3UyI+pVY2ZUTuhyGvqx7MS8d1pAoGAEv7P6fTXA/pNDP0z2ZrS
tXHuQ+MUQcm4T1IOgFoJrF084kWPfBuy9vHPtQqO/lCDJYgzngt+nCEl4bAsp889
j7u1iBFij36AwCcGkmS2OD7VxHiLVHsDxXVrnI1AxnTwytaEke/rUSAxTgB6DCaX
zsv9/obfLBY4n9chKzkC53UCgYBT7Qy6QzIIT2n41H7gmh78NElA+WLs+3onawxt
9Y3ynI80ADNtSpwTyi0jKI7DGjxLq8FHNLyAD4IKsHZ/GeTzpfp0V9jTOLfXy9uC
MnJzWMQ85CtYQHCIK3tbSmazFUNPuvv+o/pzWnBs40FtnldPsbz6RkP8X8i3iaRJ
7z0TsQKBgE4zAhAf5j9VE8wqBnKDGoptKGT5k3roj9azoTbd+CiGE9YzbjnwbZgd
mZv3tus/SEworRyiHdZAZIY1us6tZjUDI219hL2GWTGVAQWBFCE3Kqb9CvS7Iioa
u/+SwbjrnmRa3VgsQuYlZIBv8s8cS7YtQKVg0VriEN8IHAhWeWlo
-----END RSA PRIVATE KEY----
III.2.2 Création d’une CSR (Certificate Signing Request)
Une CSR est un fichier à générer pour demander un certificat. Dans notre cas il est nécessaire de créer ce fichier pour pouvoir générer plus tard un certificat auto-signé.
La commande est la suivante puis répondre aux questions :
openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:france
Locality Name (eg, city) []:L'Union
Organization Name (eg, company) [Internet Widgits Pty Ltd]:perso
Organizational Unit Name (eg, section) []:perso
Common Name (e.g. server FQDN or YOUR name) []:pc-xavior
Email Address []:none
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Le certificat ressemblera à ceci :
-----BEGIN CERTIFICATE REQUEST-----
MIICvjCCAaYCAQAweTELMAkGA1UEBhMCRlIxDzANBgNVBAgMBmZyYW5jZTEQMA4G
A1UEBwwHTCdVbmlvbjEOMAwGA1UECgwFcGVyc28xDjAMBgNVBAsMBXBlcnNvMRIw
EAYDVQQDDAlwYy14YXZpb3IxEzARBgkqhkiG9w0BCQEWBG5vbmUwggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQChXM7ITWeo8gSXsGhWOBceG0EIvzKE0dk7
uiwocntwFPZYYXt398TOoOn9v7Ws2M/iPjDvT6P2IteqyYqu58IBmAzwqCR/OJ7q
7aBxAB9RzfSxRRnWWbTzpwWqfYL9AB7EsfOHPFdHgDU4rsZUcCgaBtYuSe3uK2Iv
dCQWEC2Z9eOhvtS7GppKoFXvP/1AHxUjEirIGd6Qzy0Yc1WstLuWzHiXQaeXk471
lhUHnDby2VQjPj8J4UfvIgJvB/F0V/Rdcww5REsbm6gXT7TZHlsQTlSGOa48qldX
HQDLvy0g+w28+JsJfBQfoRmOFz/ucugr4zo5O3NtOccCGFuMaB5xAgMBAAGgADAN
BgkqhkiG9w0BAQsFAAOCAQEAKbIyozGyNNLGF9cvnXY4IvxAJ9v/hsimr9aMDNAX
ISIvWe6Me9/kObv+eHwZdYu15GRvfx3/UPPIzl6AK4BKzDMULJyiU7iMSw69MrsC
y6Tir2t4N4FI1wnCc0ySUJdfrmLbpu25MyJATOz7tIbZLiHxOp7IJ0vK2jrVHXB6
vwZMHXizZ92g+o3bMkdVJ8x3sP2tIIemSqu7jT5pGleNmMuLDSVWj4UbF2zcuvP8
a+VlJaeh8z6Z/CFr/uojSqyJ4ceuIrFCpLObls5ApXiz4KeaVf8FpPVBJ6Kl5Taa
BhiCojdsRCO1iNHB3eeDfM+aT68jyXs+omFmRqpnoIk2Jg==
-----END CERTIFICATE REQUEST-----
III.2.3 Création d’un certificat auto-signé
Pour créer le certificat, taper la ligne suivante :
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = FR, ST = france, L = L'Union, O = perso, OU = perso, CN = pc-xavior, emailAddress = none
Getting Private key
Enter pass phrase for server.key:
Le certificat auto-signé « server.crt » ressemblera à ceci :
-----BEGIN CERTIFICATE-----
MIIDeTCCAmECFE4vuwLBB5VTXYYcS0D4thEhFZCHMA0GCSqGSIb3DQEBCwUAMHkx
CzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZmcmFuY2UxEDAOBgNVBAcMB0wnVW5pb24x
DjAMBgNVBAoMBXBlcnNvMQ4wDAYDVQQLDAVwZXJzbzESMBAGA1UEAwwJcGMteGF2
aW9yMRMwEQYJKoZIhvcNAQkBFgRub25lMB4XDTIxMDMyMDA4MjI1NFoXDTIyMDMy
MDA4MjI1NFoweTELMAkGA1UEBhMCRlIxDzANBgNVBAgMBmZyYW5jZTEQMA4GA1UE
BwwHTCdVbmlvbjEOMAwGA1UECgwFcGVyc28xDjAMBgNVBAsMBXBlcnNvMRIwEAYD
VQQDDAlwYy14YXZpb3IxEzARBgkqhkiG9w0BCQEWBG5vbmUwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQChXM7ITWeo8gSXsGhWOBceG0EIvzKE0dk7uiwo
cntwFPZYYXt398TOoOn9v7Ws2M/iPjDvT6P2IteqyYqu58IBmAzwqCR/OJ7q7aBx
AB9RzfSxRRnWWbTzpwWqfYL9AB7EsfOHPFdHgDU4rsZUcCgaBtYuSe3uK2IvdCQW
EC2Z9eOhvtS7GppKoFXvP/1AHxUjEirIGd6Qzy0Yc1WstLuWzHiXQaeXk471lhUH
nDby2VQjPj8J4UfvIgJvB/F0V/Rdcww5REsbm6gXT7TZHlsQTlSGOa48qldXHQDL
vy0g+w28+JsJfBQfoRmOFz/ucugr4zo5O3NtOccCGFuMaB5xAgMBAAEwDQYJKoZI
hvcNAQELBQADggEBADezqdZRqoGh+5PT9Wz6dtspRXr4yDaMQVfu4Ig2OdtjWxvx
OV1V2hK7Sa0HCQcie1J9iIpYAyJuP/ZW0/ci2dPW0mHUWQocMkVm5Tnj1MZQFuTo
o+hohLR6OozkesAsYHaG76+8NCgpd8EzaZ7mjWi2hOZ//hFRWxUnw2jDFhy+9l5D
Ks7xhkW4M+oqyuwSkfjrNzQiwAuVcnyQnvyZFDiw2p9pcpXDABCYK6Y3yvfYOtuh
po203rrQiCLbyj6dCZKVc0I/cVZnca9wXzLcLL83GZOGotJ5AykvgJe+v7UhBhfA
61kvB62WealR5u+TJsDihyzdeq3gHDeke0SYEgM=
-----END CERTIFICATE-----
III.2.3 Emplacement des clefs et certificats
Enfin ranger la clef privée et le certificat auto-signé dans les bons répertoires :
cp server.crt /etc/ssl/certs/
cp server.key /etc/ssl/private/
III.3 Pour aller plus loin
Pour aller plus loin et par exemple créer une autorité de certification locale : lien
IV Configuration d’Apache
IV.1 Configuration du https dans Apache
Maintenant que nous avons un certificat (auto-signé et sans passphrase), il faut configurer Apache pour activer l’HTTPS.
Il faut modifier (ou créer) un fichier de site dédié au port 443. Par default il existe celui-ci : /etc/apache2/sites-available/default-ssl.conf. Nous allons utiliser celui-ci et dont le contenu sera le suivante :
IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<Directory /var/www/html/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
Les directives en couleur concernent l’activation du SSL, la localisation de la clef privée et la localisation du certificat auto-signé.
Ensuite il faut activer ce site :
cd /etc/apache2/sites-available/
a2ensite default-ssl.conf
Cela crée un lien dans le répertoire site-enable vers le fichier .conf sélectionné :
/etc/apache2/sites-enabled$ ls -als total 8 4 drwxr-xr-x 2 root root 4096 mars 20 10:44 . 4 drwxr-xr-x 8 root root 4096 oct. 17 18:08 .. 0 lrwxrwxrwx 1 root root 35 oct. 17 15:49 000-default.conf -> ../sites-available/000-default.conf 0 lrwxrwxrwx 1 root root 35 mars 20 10:44 default-ssl.conf -> ../sites-available/default-ssl.conf
Une fois fait, il faut redémarrer le service Apache :
systemctl restart apache2
IV.2 Apache : redirection automatique http vers le port 443
Dans le fichier /etc/apache2/sites-avaible/000 ajouter la directive suivante :
Redirect permanent / https://nom_serveur_ou_nom_dns/
Et enlever les autres directives non nécessaires ….
IV.3 Pour aller plus loin
A ce stade, Firefox indique que l’accès au site n’est pas sécurisé. Normal car il n’a pas d’autorité de certification prouvant que le serveur est bien celui qu’il est. On passe outre en acceptant localement ce type de certificat. Une fois fait, la communication chiffrée s’établie. Cette méthode est bien pour des devellopements ou tests locaux mais pas pour de la production bien entendu.
Ainsi pour aller plus loin il faudra voir comment créer un certificat entièrement valide. Pour cela il existe des autorités de certification payantes et gratuites telle que Let’s Encrypt par exemple
Enfin il est necessaire de sécuriser un peu plus Apache. Pour cela il existe un outil outil en ligne permettant de voir comment configurer une service (Apache, NGINX, mysql, etc..) pour la communication SSL. A voir impérativement avant toute mise en production. Lien : https://ssl-config.mozilla.org/
Et pour finir un exemple de Dokerfile (à condition d’avoir créé la clef privée et le certificat auparavant) :
################################## # Image dev pour php 8.0.3 # A partir de quelle source FROM php:8.0.3-apache # qui maintien ? MAINTAINER union31xh union31xh@gmail.com # copie la clef privee et le certificat COPY ./server.crt /etc/ssl/certs/ COPY ./server.key /etc/ssl/private/ # copie le 000-default.conf : attention redirige vers le port 4443 (A mapper avec le docker-compose.yml) COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf # copie default-ssl.conf COPY ./default-ssl.conf /etc/apache2/sites-available/default-ssl.conf # active la conf ssl RUN ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf # active le module SSL dans Apache RUN a2enmod ssl # install divers outils pour travailler dans le container si besoin RUN apt update RUN apt install -y vim RUN apt install -y tree # ajoute extension mysqli qui n'est pas présente par defaut RUN docker-php-ext-install mysqli # lance apache CMD ["apache2-foreground"] # Expose les ports du serveur Apache EXPOSE 80 EXPOSE 443