Authentification par certificat sur Apache2

contact


Si vous souhaitez me remonter des informations, ne pas hésiter

contact

Intro


Il y a plusieurs façon de restreindre un accès à certaines parties d'un site web, dont l'authentification par mot de passe ou la restriction par IP.

  • L'authentification par mot de passe est la moins fiable, le mot de passe peut être trouvé par brute force ou dictionnaire (fail2ban peut corriger en partie ce problème).

  • La restriction par IP manque de flexibilité (difficulté de lister toutes les IP, ou plage d'IP avec un risque d'erreurs, dans le cas de périphériques mobiles) (cela peut être corrigé avec un vpn).

    • Ces deux solutions ont leur points faible qui peut être corrigé, mais cela demande de mettre en place d'autres outils, tout le monde ne sait pas ou n'a pas forcements envie de les mettre en place
  • L'autre possibilité, peut connue, c'est l'authentification par certificat. Vous avez un certificat qui a été certifier par votre propre autorité de certification. Vous mettez dans la configuration d'Apache votre AC, et vous mettez votre certificat dans votre navigateur. Ainsi, si le certificat est bien signiez par l'Authorité de Certification présente sur le serveur, alors il vous laisse l'accès à la page ou au domaine suivant ce que vous bloquez

Il est recommandé de faire des Vhost par sous domaine pour les accès par certificat, afin d'éviter les effets de bord permettant à des attaquants de pouvoir accèder au chemin sécurisés par le certificat
Ex : blog.chezme.eu/yoyo -> yoyo.blog.chezme.eu

Création de la partie Authorité de Certification


Attention à bien adapter la clé avec le temps, car peut être dans 6 mois il faudra créer des clés en 4096 sinon votre navigateur vous refusera la clé avec le message suivant :
"SSL_ERROR_BAD_CERT_ALERT" SSLCACertificateFile

Comme par défaut openssl chiffre en 2048, vous pouvez enlever 2048, ainsi le chiffrement sera celui par défaut, quand la norme changera, pas besoin d'adapter

Création de la clé

openssl genrsa -des3 -out CA.key 2048

Explication :

  • genrsa : sert à générer la clé privée
  • -des3 : c'est la méthode de chiffrement (cipher)

Il vous sera demande d'entrer un mot de passe, indiquer un mot de passe fort :

Enter pass phrase for CA.key:
Verifying - Enter pass phrase for CA.key:

Creation du certificat CA

Il sera valide 3650 j soit environ 10 ans

Vous pouvez indiquer tout et n'importe quoi pour la CA comme pour le CSR client, ce qui importe, c'est que le certificat client soit signé par l'autorité de certification
Je vous conseille tout de même de remplir correctement les champs afin de reconnaître vos certificats si vous en faites plusieurs
Lors de la question Common Name (e.g. server FQDN or YOUR name) []: je vous conseille d'indiquer le sous domaine ou domaine utilisé pour l'authentification (pour la partie CA) et le nom ou prénom (pour la partie client)

openssl req -x509 -new -key CA.key -sha256 -days 3650 -out CA.pem

Explication :

  • req : Sert pour la génération du certificat
  • X509 : Indique que l'on utilise la partie permettant de signer le certificat
  • -new : Indique une nouvelle demande de certificat
  • -key : Requière la clé créée ci-dessus, si vous n'indiquez pas la clé elle sera créée automatiquement en 2048
  • -sha256 : C'est l'algorithme de hashage qui permet de faire une empreinte du certificat qui pourrait servir pour la révocation
  • -days : Nombre de jours avant expiration
  • -out : Nom du fichier en sortie

Il vous sera demandé les choses suivantes :

Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Yvelines
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Chezme
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:chezme.eu

Certificat utilisateur


Création de la clé de l'utilisateur, comme pour la clé de l'autorité de certification

openssl genrsa -out yoann.key 2048

Crée le fichier CSR

Le fichier CSR contient les informations de l'entreprise qui seront vérifiées par l'autorité de certification à laquelle vous en faites la demande, dans notre cas nous même

openssl req -key yoann.key -new -out yoann.csr 

On vous demandera de remplir les champs suivants :

Laissez le challenge password vide en appuyant sur entrée

Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Yvelines
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Yoann
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Creation du certificat utilisateurs

Il sera valide 365 j soit environ 1 an

Explication :

  • openssl : C'est la commande
  • -req : On utilise la partie qui signe les CSR
  • -days : indique la validité en jours
  • -in : Prend en entrée le CSR
  • CA et CAkey : A besoin des fichiers d'autorité de certificat
  • -set_serial : Numéro de série unique afin d'éviter les doublons
  • -out : Indique le fichier de sortie
openssl x509 -req -days 365 -in yoann.csr -CA CA.pem -CAkey CA.key -set_serial 01 -out yoann.crt

Il vous sera demandé

Enter pass phrase for CA.key:

On genere le p12 pour mettre dans le navigateur de l'utilisateur

openssl pkcs12 -export -clcerts -inkey yoann.key -in yoann.crt -out yoann.p12 -name "yoann"

Explication :

  • -pkcs12 : Elle permet la création du PKCS
  • -export : Specifie la demande création
  • -clcerts : Indique le certificat client (pas celui de l'Autorité de Certification)
  • -name : permet de reconnaitre le nom dans les logiciels ayant importés le certificat

Indiquer le mot de passe du p12, il vous sera demandé lors de l'enregistrement dans le navigateur. enregistrer le dans votre keepass

Enter Export Password:
Verifying - Enter Export Password:

Configuration de APACHE2


Ajout sur la page du domaine

Il suffit d'ajouter cela dans le site, n'oublier pas de copier le CA.pem au bon endroit et de modifier la ligne SSLCACertificateFile

SSLEngine On
SSLVerifyClient require
SSLCACertificateFile /etc/ssl/certs/Ca.pem
SSLVerifyDepth 1

Explication :

  • SSLEngine : active le SSL
  • SSLVerifyClient : oblige la présence du certificat, les autres options sont none,optional,require,optional_no_ca
  • SSLCACertificateFile : indique le chemin de l'Authorité de Certification
  • SSLVerifyDepth : Defini le nombre de profondeur de certificat intermediaire, dans notre cas 1 vu qu'on la certifier avec notre AC, mais si vous avez une AC (root) qui a certifié votre certificat AC alors il faudra indiquer 2

Ajout dans un directory

Dans cette exemple, on remarque que dans le directory est indiqué la partie vérification et le reste et dans le contenu du Vhost

SSLEngine On
SSLCACertificateFile /etc/ssl/certs/CaPub.pem
<Location "/adm">
                SSLVerifyClient require
                SSLVerifyDepth 1
</Location>

Import du p12 dans le navigateur (Firefox)

Allez dans edition/paramètre
Chercher Certificat dans la barre de recherche
Paramètre
Cliquez sur afficher les certificat / importer / choissisez votre fichier / Indiquez le mot de passe du p12
Voici le p12 enregistrer
Infop12
Voici le type de popup qui s'affiche lors de l'authentification
Auth

Difference entre authentification par domaine, sous-domaine et directory


Repris du site d'apache

Dans le contexte du domaine ou sous domaine

elle s'applique au processus d'authentification du client utilisé au cours de la négociation SSL standard lors de l'établissement d'une connexion.

Directory

Dans un contexte de répertoire, elle force une renégociation SSL avec le client selon la nouvelle profondeur spécifiée, après la lecture d'une requête HTTP, mais avant l'envoi de la réponse HTTP.

Post-Scriptum

La création de certificat pour l'authentification vu dans cette doc peut être intéressant dans des très petits entreprises, dans de plus grosses sociétés, il sera préférable de mettre en place un outil permettant d'automatiser un maximum la tache t-elle que EJBCA
Je n'ai montré que le plus simple, mais les possibilités sont enorme, pour cela je vous laisse consulter le site suivant :
Apache certificat

sources


Apache
https://httpd.apache.org/docs/2.4/fr/ssl/ssl_howto.html
https://httpd.apache.org/docs/2.4/fr/mod/mod_ssl.html
https://ungeek.fr/http-ssl-client-certificate/
https://www.linuxtricks.fr/wiki/openssl-creation-de-certificats-et-ca-autosignes
Openssl
https://linux.die.net/man/1/openssl
https://www.openssl.org/docs/man1.0.2/man1/pkcs12.html
https://www.openssl.org/docs/manmaster/man1/openssl-req.html