Authentification par certificat SSL client

Ce document décrit les configurations nécessaires pour effectuer une certification par certificat client disponible en standard depuis JCMS 10. Il abordera les principes et la configuration pour Apache Tomcat et Apache Http Server.

1. Principe

L'authentification d'un utilisateur par certificat client SSL est disponible dans JCMS 10 (cf JCMS-6127), son principe est le suivant : 

  • Le serveur est accessible en SSL et demande au client d'envoyer un certificat client d'authentification (selon la norme SSL).
  • Ce certificat est transmis à l'instance JPlatform et est validé à partir de l'entrepôt de validation défini dans les propriétés.
  • Une fois le certificat validé, le sujet du certificat est analysé par l'expression régulière d'extraction d'un login
  • Si un login est trouvé, l'utilisateur correspondant est alors authentifié.

2. Pré-requis

3. Configuration du navigateur

Importer dans le navigateur le certificat client (au format p12, contenant la clé privée et le certificat), il doit donc être disponible dans le magasin du navigateur pour s'authentifier.

Importer aussi la chaine d'authentification (ca-chain.cert.pem) comme autorité valide (soi l'autorité interne est utilisée).

4. Configuration du serveur

4.1 Configuration tomcat

4.1.1 Configuration SSL 

Suivre la documentation disponible à https://tomcat.apache.org/tomcat-8.5-doc/ssl-howto.html

Importer le certificat du serveur dans le keystore utilisé par tomcat, ex :

keytool -importkeystore -srckeystore certs/webServer/webServer.p12 -keystore ~/.keystore

Changer l'alias du certificat importé si besoin (via la commande keytool -changealias) :

[15:22] smadja@orion:intermediate $ keytool -list -keystore ~/.keystore 
Entrez le mot de passe du fichier de clés :

Type de fichier de clés : JKS
Fournisseur de fichier de clés : SUN

Votre fichier de clés d'accès contient 1 entrée

1, 18 sept. 2017, PrivateKeyEntry,
Empreinte du certificat (SHA1) : E6:A5:67:D6:23:6C:2B:83:A8:EE:22:E6:75:94:F3:AD:C8:01:38:3B

[15:24] smadja@orion:intermediate $ keytool -changealias -keystore ~/.keystore -alias 1 -destalias tomcat
Entrez le mot de passe du fichier de clés :
Entrez le mot de passe de la clé pour <1>

[15:24] smadja@orion:intermediate $ keytool -list -keystore ~/.keystore
Entrez le mot de passe du fichier de clés :

Type de fichier de clés : JKS
Fournisseur de fichier de clés : SUN

Votre fichier de clés d'accès contient 1 entrée

tomcat, 18 sept. 2017, PrivateKeyEntry,
Empreinte du certificat (SHA1) : E6:A5:67:D6:23:6C:2B:83:A8:EE:22:E6:75:94:F3:AD:C8:01:38:3B
[15:24] smadja@orion:intermediate $

Modifier le certificat importé pour qu'il ai le même mot de passe que le keystore (requis pour tomcat)

keytool -keypasswd -alias tomcat -keystore ~/.keystore
Importer aussi la chaine de validation de ce certificat
keytool -import -alias interneCa -keystore ~/.keystore -trustcacerts -file ca-chain.cert.pem

 

4.1.2 Configuration de l'authentification client dans tomcat

Créer un truststore et y ajouter la chaine de certification associé aux certificats d'authentification client :

keytool -import -alias interneCa -keystore /home/smadja/dev/pki/truststore -trustcacerts -file ca-chain.cert.pem

Configurer tomcat pour y ajouter l'authentification client en ajouter dans le fichier server.xml les paramètres suivants au connecteur SSL

truststoreFile="/home/smadja/dev/pki/truststore"
truststorePass="changeit"
truststoreType="JKS"
clientAuth="want"

Redémarrer tomcat

 

4.1.3 Validation 

Une requête sur le site SSL doit maintenant activer la demande de soumission d'un certificat client à partir du navigateur :

selectcertificate 

 

 

4.2 Configuration tomcat + apache

Configurer Apache pour fonctionner en SSL (via la documentation https://httpd.apache.org/docs/2.4/fr/ssl/ssl_howto.html) et mod_jk pour accéder à l'application

Créer le répertoire contenant les certificats de validation des certificats client (voir http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcacertificatepath pour la documentation)

mkdir /apache_cadir

y recopier la chaine de certificat racine

cp ca-chain.cert.pem /apache_cadir

Créer le hash

cd /apache_cadir
ln -s ca-chain.cert.pem $(openssl x509 -in ca-chain.cert.pem -subject_hash -noout).0

Ajouter dans la configuration du site :

SSLCACertificatePath /apache_cadir
SSLVerifyClient optional
SSLOptions +StdEnvVars +ExportCertData
SSLVerifyDepth 10
JkOptions +ForwardSSLCertChain 

 

5. Configuration de JPlatform

Aller dans l'administration du site, onglet Accès

Y saisir les informations concernant le truststore et l'expression régulilère d'extraction (si besoin)

Créer si besoin le répertoire contenant les CRL.

conf 

 

Sauvegarder et vérifier dans les logs si l'authentification client est correctement activée.

L'authentification via le certificat est maintenant valide. L'utilisateur peut donc maintenant se connecter sans utiliser la mire de login.