Comment authentifier ses utilisateurs de son site à l’aide d’un certificat signé plutôt que par login et mot de passe ? C’est ce que nous allons voir dans les lignes ci-dessous.
Sources
- Tonio™ Blog : Authentification SSL client avec Apache
- Stuff-things.net : Configuring Apache for SSL Client Certificate Authentication
- Linux-france.org : La création des certificats
A L’aide d’un certificat auto-généré
Largement inspiré du Tonio™ Blog, voici la marche à suivre pour pouvoir générer un certificat avec lequel l’utilisateur pourra être reconnu apte à visiter la partie protégée de votre site. Elle s’oriente sur trois points :
- Créer une autorité de certification.
- Créer un certificat serveur.
- Créer un certificat client.
Elle devra être installée chez le client pour que le certificat auto-signé de votre site soit reconnu de confiance par le navigateur
Certificat fils de votre autorité de certification, il sécurise la connexion vers votre site (permet le HTTPS). Il sera lu automatiquement par votre navigateur et sera reconnu comme étant de confiance.
Certificat à donner aux utilisateurs autorisés à accéder aux parties protégées du site.
Création de l’autorité de certification
# Nouvelle clé privée openssl genrsa -out Infovergne-CA.key # Demande de création de certificat (CSR: Certificate Signing Request) openssl req -new -key ./Infovergne-CA.key -out ./Infovergne-CA.csr \ -subj "/C=FR/ST=/L=Clermont-Ferrand/O=Infovergne/CN=Infovergne" # Signature de la demande, création du certificat CRT openssl x509 -req -days 7 -in ./Infovergne-CA.csr -out ./Infovergne-CA.crt -signkey ./Infovergne-CA.key # Affichage des informations relatives au certificat (autorité de certification) openssl x509 -in Infovergne-CA.crt -text # Extraction de la clé publique si besoin openssl rsa -in Infovergne-CA.key -pubout -out Infovergne-CA.public.key
Il reste à envoyer le fichier CRT à vos utilisateurs pour qu’ils l’intègrent dans leur magasin, catégorie Autorités de confiance.
Création et signature du certificat serveur
# Nouvelle clé privée openssl genrsa -out mysecurewebsite.key # Demande de création de certificat (CSR: Certificate Signing Request) openssl req -new -key ./mysecurewebsite.key -out mysecurewebsite.csr \ -subj "/C=FR/ST=/L=Clermont-Ferrand/O=mysecurewebsite/CN= mysecurewebsite.infovergne.com" # Signature de la demande, création du certificat CRT sous l'autorité de confiance créée précédemment. openssl x509 -req -in ./mysecurewebsite.csr -CA ./Infovergne-CA.crt -CAkey ./Infovergne-CA.key \ -CAcreateserial -out ./mysecurewebsite.crt -days 7 # Si besoin : # Extraction de la clé privée au format PKCS12 # openssl pkcs12 -export -in mysecurewebsite.crt -inkey mysecurewebsite.key \ # -out mysecurewebsite.p12 -name "mysecurewebsite certificate" # Affichage des informations relatives au certificat # openssl pkcs12 -info -in mysecurewebsite.p12 # openssl rsa -in mysecurewebsite.key -pubout -out mysecurewebsite.public.key # openssl rsa -in mysecurewebsite.key -out mysecurewebsite.nopassphrase.key
Configuration dans Apache, sites-enabled
Pour que l’accès à la ressource protected soit protégé :
SSLEngine On SSLCACertificateFile /opt/certs/Infovergne-CA.crt SSLCertificateFile /opt/certs/mysecurewebsite.crt SSLCertificateKeyFile /opt/certs/mysecurewebsite.key <Location /protected> SSLOptions +StdEnvVars SSLVerifyClient require SSLVerifyDepth 2 </Location>
Création et signature du certificat client
# Nouvelle clé privée openssl genrsa -out olivier.key # Demande de création de certificat (CSR: Certificate Signing Request) openssl req -new -key ./olivier.key -out olivier.csr \ -subj "/C=FR/ST=/L=Clermont-Ferrand/O=Olivier/CN=Olivier" # Signature de la demande, création du certificat CRT sous l'autorité de confiance créée précédemment. openssl x509 -req -in ./olivier.csr -CA ./Infovergne-CA.crt -CAkey ./Infovergne-CA.key \ -CAcreateserial -out ./olivier.crt -days 7 # Extraction de la clé privée au format PKCS12 à envoyer de façon sécurisée à l'utilisateur final openssl pkcs12 -export -in olivier.crt -inkey olivier.key -out olivier.p12 -name "olivier certificate" # Affichage des informations de la clé privée openssl pkcs12 -info -in olivier.p12 # Si besoin, extraction de la clé publique # openssl rsa -in olivier.key -pubout -out olivier.public.key
Il reste à envoyer le fichier P12 à vos utilisateurs pour qu’ils l’intègrent dans leur magasin, catégorie Mes certificats (automatique).
Création d’un certificat client via Letsencrypt
A priori il n’est pas possible de créer des certificats clients à partir des certificats SSL générés par LetsEncrypt.
# Quelques recherches ci et là : # openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout olivierLet.pem -out olivierLet.der \ # -outform der -subj "/C=FR/ST=/L=Clermont-Ferrand/O=/CN=mysecurewebsite.infovergne.com" # /opt/letsencrypt/letsencrypt-auto certonly --authenticator manual \ # --server https://acme-v01.api.letsencrypt.org/directory --text --csr olivierLet.der # mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge # cd /tmp/certbot/public_html/ # printf "%s" *** > .well-known/acme-challenge/*** # python2 -c "import BaseHTTPServer, SimpleHTTPServer; \ # s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); s.serve_forever()" # Autre début de solution # openssl pkcs12 -export -out olivierLets.p12 -inkey /etc/letsencrypt/live/ \ # mysecurewebsite.infovergne.com/privkey.pem -in /etc/letsencrypt/live/ \ # mysecurewebsite.infovergne.com/cert.pem -certfile /etc/letsencrypt/live/ \ # mysecurewebsite.infovergne.com/chain.pem
formidable et aussi le blog fantastique. J’ai vraiment l’intention de grâce, pour nous
donner de meilleurs détails.