Identification Firefox via un certificat SSL

Dans l’article précédent consacré à l’installation d’un certificat SSL sur un serveur Glassfish, nous avons effectué une demande de certificat que nous avons installé avec le listener HTTP pour chiffrer les informations qui transitent et assurer l’identité du serveur.

Ce nouvel article présente comment créer et enregistrer un certificat sur Firefox. Nous développerons ensuite une page JSP que nous déploieront dans Glassfish et qui ne peut être vue que des utilisateurs avec un certificat signé.

Générer une demande de signature d’un certificat

Pour créer une clé et effectuer une demande de signature associée dans Firefox, vous utiliserez généralement les outils NSS de Mozilla. A moins de vouloir faire les choses en grand, Key Manager est un add-on Firefox qui encapsule et permet de générer facilement vos clés à l’aide de l’interface graphique; Installez la plugin et générez un certificat puis une demande de signature comme suit :

  • Sélectionnez le menu « Tools -> Key Manager Tool Box -> Key Manager »
  • Dans l’onglet « Your Keys », cliquez sur ne bouton « Generate CSR »
  • Entrez les informations qui conviennent à votre certificat et sélectionnez le bouton « Generate PKCS#10 » comme ci-dessous :
  • Une fenêtre vous proposant d’envoyer votre demande directement au serveur web s’affiche. Cliquer plutôt sur le bouton « Save » pour enregistrer directement la demande en local. Envoyez le fichier .p10 à l’autorité de certification.

Signer la demande

Une fois encore, nous allons utiliser notre propre autorité de certification pour signer le certificat comme ci-dessous :

cp Desktop/Greg.p10 CA/newreq.pem 
/usr/lib/ssl/misc/CA.pl -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            b4:1d:38:bd:49:9c:6c:47
        Validity
            Not Before: Dec  5 15:07:20 2010 GMT
            Not After : Dec  5 15:07:20 2011 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Ile de France
            localityName              = Paris
            organizationName          = ArKZoYd
            commonName                = Greg
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                54:50:63:3F:81:57:1D:B4:61:F3:C3:36:94:83:A5:0C:8A:44:46:45
            X509v3 Authority Key Identifier:
                keyid:E0:FB:6B:4C:38:31:CA:A3:67:2C:82:28:86:A7:A9:E8:96:6A:AD:22

Certificate is to be certified until Dec  5 15:07:20 2011 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
 
cp newcert.pem Desktop/Greg.pem 

Importez le certificat signé

Une fois que vous avez la réponse à la demande de certificat, assurez-vous que l’authorité de certification est connue dans l’onglet Authorities. Si ce n’est pas le cas, importez le certificat associé.

  • Retournez ensuite à l’onglet « Your Keys » et cliquez sur le bouton « Import Cert » pour importer le certificat signé; le message ci-dessous d’affiche :

Si vous sélectionnez l’onglet « Your Certificates », vous pouvez visualiser votre certificat; vous trouverez le détenteur et l’émetteur comme ci-dessous :

Vous pouvez supprimer le certificat « Self Signed » qui précéde.

Importer le certificat de l’autorité dans Glassfish

L’étape suivante consiste à enregistrer le certificat de l’autorité de certification dans le keystore cacerts.jks de Glassfish pour que celui-ci reconnaisse le certificat enregistré sur le client.

$ cd /opt/glassfishv3/glassfish/domains/domain1/config

$ keytool -importcert -alias ca-easyteam.fr
-file ~/CA/demoCA/cacert.pem -keystore cacerts.jks
Enter keystore password: 
Owner: CN=CA, O=ArKZoYd, ST=Paris, C=FR
Issuer: CN=CA, O=ArKZoYd, ST=Paris, C=FR
Serial number: b41d38bd499c6c41
Valid from: Sat Dec 04 19:09:39 CET 2010 until: Tue Dec 03 19:09:39 CET 2013
Certificate fingerprints:
     MD5:  B3:59:FE:AF:B6:DF:42:8F:B5:8A:08:1E:44:AE:15:ED
     SHA1: 72:07:A2:8A:EF:D4:7B:6B:A3:AF:05:91:04:92:3B:E5:E4:AF:99:16
     Signature algorithm name: SHA1withRSA
     Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E0 FB 6B 4C 38 31 CA A3   67 2C 82 28 86 A7 A9 E8  ..kL81..g,.(....
0010: 96 6A AD 22                                        .j."
]
]

#2: ObjectId: 2.5.29.19 Cri ticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: E0 FB 6B 4C 38 31 CA A3   67 2C 82 28 86 A7 A9 E8  ..kL81..g,.(....
0010: 96 6A AD 22                                        .j."
]

[CN=CA, O=ArKZoYd, ST=Paris, C=FR]
SerialNumber: [    b41d38bd 499c6c41]
]

Trust this certificate? [no]:  yes
Certificate was added to keystore

Créer une application sécurisée par le certificat client

Comme décrit dans cet article sur le blog de Kumar Jayanti, vous pouvez sécuriser une application simplement à travers les 3 étapes ci-dessous :

  • Définissez le groupe associé aux client authentifiés par un certificat en modifiant le contenu du fichier domain.xml
    <auth-realm 
    classname="com.sun.enterprise.security.auth.realm.certificate.CertificateRealm"
    name="certificate">
    <property name="assign-groups" value="authorized" />
    </auth-realm>
  • Définissez la correspondance entre le role de l’application et le groupe du serveur à l’aide du fichier sun-web.xml de l’application comme ci-dessous :
    <security-role-mapping>
    <role-name>authorized</role-name>
    <group-name>authorized</group-name>
    </security-role-mapping>
  • Enfin définissez la méthode de connection  groupe associé aux client authentifiés par un certificat et les ressources protégées en modifiant le contenu du fichier web.xml comme ci-dessous :
    <security-constraint>
    <display-name>CA-Security</display-name>
    <web-resource-collection>
    <web-resource-name>secure resource</web-resource-name>
    <description/>
    <url-pattern>/faces/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
    <description/>
    <role-name>authorized</role-name>
    </auth-constraint>
    <user-data-constraint>
    <description/>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    </security-constraint>
    <login-config>
    <auth-method>CLIENT-CERT</auth-method>
    </login-config>
    <security-role>
    <description/>
    <role-name>authorized</role-name>
    </security-role>

Pour les besoins de mon test, j’ai créé une facelet index.xhtml dans une application développée avec Oracle Enterprise Pack for Eclipse que vous pouvez télécharger l’application de démonstration ici qui inclut la page et les fichiers de paramétrages.

Tester l’application

Déployez l’application et testez l’URL associée. Le navigateur web vous demande quel certificat envoyer au serveur :

Si l’application est correctement configurée, vous pouvez accéder à la page web; sinon, vous aurez accès à une page d’erreur…