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…