Enregistrer un certificat SSL dans Glassfish

Comme pour la plupart des serveurs HTTP, Glassfish génère un certificat « Self-Signed » par défaut lors de son installation. Cela qui permet d’utiliser SSL pour chiffrer le protocole entre le client et le serveur. Toutefois cela ne garantit absolument pas la sécurité du client :

  • Que savez-vous du site ou de la société qui ont généré le certificat ?
  • Si le certificat est compromis et que quelqu’un peut déchiffrer vos données, comment pouvez-vous le savoir ?

Les différentes autorités de certification comme Verisign, Thawte, GoDaddy ou les autres offrent des services pour répondre à ces questions et protéger les utilisateurs ou les données grâce aux infrastructures à clés publiques et leur collaboration avec les fournisseurs d’outils web. Cet article présente comment remplacer le certificat « self-signed » par un certificat délivré par une authorité de certification dans Glassfish v3

Remarques préalables

Avant de commencer notez bien les quelques points ci-dessous :

  • Pour des raisons de performance et de sécurité, vous voudrez peut-être utiliser Apache HTTPD en frontal de Glassfish. Dans ce cas, il faut configurer mod_jk et enregistrer le certificat directement dans le listener Apache.
  • Glassfish utilise les outils Java pour gérer ses certificats, ce qui parait assez naturel pour un outil développé en Java. Pour faciliter le démarrage, il faut savoir que :
    • L’ensemble des fichiers de configuration sont dans le dossier de configuration du domaine, c’est à dire en général dans $GLASSFISH_HOME/domains/<domainname>/config
    • Le port SSL par défaut de Glassfish est 8181
    • Les mots de passe par défaut du référentiel des clé (keystore) et de la clé sont « changeit ». Toutefois, si vous positionnez un mot de passe sur l’utilisateur admin, à l’aide de la commande asadmin change-master-password par exemple, les mots de passe de l’utilisateur mais également du keystore et de la clé sont modifiés
    • L’alias de la clé SSL utilisées par défaut est s1as.

Supprimer la clé existante du keystore

Vous commencerez généralement par supprimer la clé existante du keystore, pour cela, il faut positionner l’environnement pour accéder à l’ensemble des outils situés dans $JRE_HOME/bin ou $JAVA_HOME/bin. Commencer par une sauvegarde du store puis lancez la commande keytool avec l’option -delete comme ci-dessous :

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

$ cp keystore.jks keystore.jks.bak

$ keytool -list -keystore keystore.jks
Enter keystore password:

***************** WARNING WARNING WARNING *****************
* The integrity of the information stored in your keystore *
* has NOT been verified! In order to verify its integrity, *
* you must provide your keystore password. *
***************** WARNING WARNING WARNING *****************

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

s1as, Jun 9, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): D5:45:32:04:5A:1B:13:84:BA:76:85:AF:4C:06:AA:A7


$ cp keystore.jks keystore.jks.bak

$ keytool -delete -alias s1as -keystore keystore.jks

Créer une nouvelle clé et générer une demande de certification

Une fois le store disponible, vous pouvez créer une clé correspondant à vos attentes; en particulier, il faut que la section « common name » (cn) du distinguished name (-dname) à l’adresse du serveur sur le web :

$ keytool -genkeypair -dname "cn=red.easyteam.fr, o=arkzoyd, c=FR" 
-alias s1as -keystore keystore.jks
Enter keystore password:
Enter key password for <s1as>
(RETURN if same as keystore password):


$ keytool -list -keystore keystore.jks
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

s1as, Dec 5, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): FD:55:A4:2E:37:A4:8C:7F:E0:9E:F1:54:3E:3A:23:74


$ keytool -certreq -alias s1as -keystore keystore.jks -file red.csr

Envoyer la demande de signature à l’autorité de certification

En général, vous enverrez le fichier de Certification Signing Request (red.csr) à l’autorité de certification que vous aurez choisie. Pour les besoins d’un test ou si vous voulez, comme dans mon cas, mettre en oeuvre une PKI pour également authentifier les clients, vous pourrez également créer votre propre autorité de certification comme dans mon précédent article à propos de l’utilisation des certificats avec les bases de données Oracle :

$ cp red.csr ~/CA/newreq.pem

$ cd ~/CA

$ /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:44
Validity
Not Before: Dec 5 00:59:26 2010 GMT
Not After : Dec 5 00:59:26 2011 GMT
Subject:
countryName = FR
organizationName = arkzoyd
commonName = red.easyteam.fr
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
CA:85:99:C9:37:48:E8:25:78:41:2C:74:79:1C:88:59:7A:1F:E9:D0
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 00:59:26 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
/opt/glassfishv3/glassfish/domains/domain1/config/red.pem

Enregistrer le certificat de l’autorité de certification

Pour pouvoir enregistrer le certificat signé dans le keystore, il faut s’assurer que le certificat de l’autorité de certification soit connue au préalable. Dans le cas contraire, vous aurez une erreur indiquant que le certificat n’est pas connu : keytool error: java.lang.Exception: Failed to establish chain from reply. Si vous utilisez une CA standard, elle est déjà enregistrée dans la liste des CA. Dans le cas ou vous utilisez votre propre autorité, vous devez enregistrer le certificat comme ci-dessous :

$ keytool -importcert -alias xXx 
-file cacert.pem -keystore keystore.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 Criticality=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

Enregistrer la signature dans le keystore

Une fois le certificat signé, vous pouvez l’enregistrer dans le keystore à l’aide du certificat de la CA comme ci-dessous :

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

Supprimer l’ensemble des lignes avant la section -----BEGIN CERTIFICATE----- pour que le fichier red.pem ne contienne que le certificat; si vous ne faite pas cette opération préalable, vous rencontrerez l’erreur suivante keytool error: java.lang.Exception: Input not an X.509 certificate. Vous pouvez ensuite enregistrer le certificat :

$ keytool -importcert -alias s1as 
-file red.pem -keystore keystore.jks

Enter keystore password:
Re-enter new password:
Owner: CN=red.easyteam.fr, O=arkzoyd, C=FR
Issuer: CN=CA, O=ArKZoYd, ST=Paris, C=FR
Serial number: b41d38bd499c6c44
Valid from: Sun Dec 05 01:59:26 CET 2010 until: Mon Dec 05 01:59:26 CET 2011
Certificate fingerprints:
MD5: 3B:47:97:28:7F:A8:B3:93:C6:22:10:4E:B4:FD:D1:24
SHA1: 37:74:41:9D:DF:6F:AD:30:C1:84:1F:DA:3F:67:C3:F5:96:7F:24:14
Signature algorithm name: SHA1withRSA
Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: CA 85 99 C9 37 48 E8 25 78 41 2C 74 79 1C 88 59 ....7H.%xA,ty..Y
0010: 7A 1F E9 D0 z...
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]

#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."
]
]

#4: ObjectId: 2.16.840.1.113730.1.13 Criticality=false

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


$ keytool -list -alias s1as -keystore keystore.jks
Enter keystore password:
s1as, Dec 4, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): B2:7D:FD:44:B4:F6:09:B7:A6:E6:C6:00:20:F4:63:B6

Tester la configuration

Redémarrez le domaine Glassfish et tester l’URL configurée en HTTPS. Enregistrer au préalable et si nécessaire, le certificat de l’autorité dans votre navigateur web comme ci-dessous (Si vous utilisez une autorité standard, cette étape est inutile) :

Vous pouvez également vous connecter directement avec la commande openssl comme ci-dessous (changez l’adresse et le port) comme ci-dessous :

openssl s_client -connect red.easyteam.fr:8181

CONNECTED(00000003)
depth=0 /C=FR/O=arkzoyd/CN=red.easyteam.fr
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=FR/O=arkzoyd/CN=red.easyteam.fr
verify return:1
---
Certificate chain
0 s:/C=FR/O=arkzoyd/CN=red.easyteam.fr
i:/C=FR/O=arkzoyd/CN=red.easyteam.fr
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICqzCCAmmgAwIBAgIETPriyDALBgcqhkjOOAQDBQAwOTELMAkGA1UEBhMCRlIx
EDAOBgNVBAoTB2Fya3pveWQxGDAWBgNVBAMTD3JlZC5hcmt6b3lkLmNvbTAeFw0x
MDEyMDUwMDU0MzJaFw0xMTAzMDUwMDU0MzJaMDkxCzAJBgNVBAYTAkZSMRAwDgYD
VQQKEwdhcmt6b3lkMRgwFgYDVQQDEw9yZWQuYXJrem95ZC5jb20wggG3MIIBLAYH
KoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qcLuzk5/YRt1I870QAwx4/gLZRJmlF
XUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJPu6nX
/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccC
FQCXYFCPFSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o6
6oL5V0wLPQeCZ1FZV4661FlP5nEHEIGAtEkWcSPoTCgWE7fPCTKMyKbhPBZ6i1R8
jSjgo64eK7OmdZFuo38L+iE1YvH7YnoBJDvMpPG+qFGQiaiD3+Fa5Z8GkotmXoB7
VSVkAUw7/s9JKgOBhAACgYAyP99YQRJCal9gTPnmqATejM+Ed50qFflLNgN3vynt
XF2W/8BoT7r8vgy0EG1uE7NotXqaHSfI1ZAJeOGQDZTXvjAErrqKbBH/PfgjTZh9
aBxzS+SK7DPpEii6mvGXroZhyWl05CXjy+xTYjr58oylt18/IyqVooHsu7smMwr7
cjALBgcqhkjOOAQDBQADLwAwLAIUTPAnNucyoNBmlo49NbSdz+VHw4ICFHLDbCFB
Jcj6IYS98HtIEN5PxwEU
-----END CERTIFICATE-----
subject=/C=FR/O=arkzoyd/CN=red.easyteam.fr
issuer=/C=FR/O=arkzoyd/CN=red.easyteam.fr
---
No client certificate CA names sent
---
SSL handshake has read 1192 bytes and written 261 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-DSS-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : DHE-DSS-AES256-SHA
Session-ID: 4CFAF360E33079050381F8792503BCB28A0C8F41082BC6A28F7C7B8A83022542
Session-ID-ctx:
Master-Key: 15E3425BFCB8BD5501529C68A5862FCF4EC4DC4B5E01BE3191FE16EA820A6DC1ABA92D46318F806C649C8216A3E5077B
Key-Arg : None
Start Time: 1291514720
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
read:errno=0

1 réflexion sur “Enregistrer un certificat SSL dans Glassfish”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *