Dans le contexte ITIM, nous voulons sécuriser l'accès au Self-Service via https, notamment car celui-ci permet aux utilisateurs de changer ou de ré-initialiser leur mot de passe.
Cela a l'air facile, puisque le serveur http IHS IBM Http Server est basé sur apache. Dans un précédent article, j'expliquais comment faire pour activer un accès https sur apache.
Malheureusement, IBM n'utilise pas les composants OpenSSL, mais utilise ses propres modules, et notamment mod_ibm_ssl pour le module du serveur http, qui est de plus incompatible avec les certificats SSL généré par les utilitaires OpenSSL. Il faut donc utiliser toute la panoplie des outils IBM.
La mise en place de https passe par plusieurs étapes :
Nous allons faire les manipulations en ligne de commande, car le serveur ne dispose pas d'une interface graphique.
L'utilitaire IBM dans ce cas est gsk7cmd, un script shell qui lance le programme Java ikeyman.
Cet utilitaire permet d'agir sur plusieurs éléments :
Note : on peut également utiliser le programme gsk7capicmd, qui est un exécutable POSIX (pas de Java), mais qui supporte un chiffrement plus fort que gsk7cmd. Il est également plus rapide.
Nous allons d'abord créer une base de données de clés (key database), qui va stocker les certificats. Cette base sera stockées dans le répertoire /etc/ssl/certs, qui permet de regrouper les certificats.
$IHS_HOME/bin/gsk7cmd -keydb -create -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -type cms -expire 3650 -stash
Les options utilisées :
Nous pouvons ensuite créer un certificat. Celui-ci peut être auto-signé, ou être une demande de certification qui sera par la suite signé par une PKI interne, afin d'être reconnu par les navigateurs.
$IHS_HOME/bin/gsk7cmd -cert -create -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -label "ITIM-Self-Service" \
-expire 3650 -default_cert [yes|no] -dn "CN=myserver.mycorp.com,O=mycorp,C=fr"
Les options utilisées :
Le format du DN est celui-ci : CN=common_name, O=organization, OU=organization_unit, L=location, ST=state, province, C=country.
Seuls les attributs CN, O et C sont requis.
On peut par exemple avoir :
CN=itimserver.mycorp.com,O=MyCompany,OU=IT,C=FR
Le CN doit correspondre au FQDN (Fully Qualified Domain Name) du serveur (correspondant à l'URL qui est protégée en https).
On peut générer une demande de certificat, qui devra par la suite être signée par une autorité de certification :
$IHS_HOME/bin/gsk7cmd -certreq -create -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -label "ITIM-Self-Service" \
-dn DN -size 1024 -file /etc/ssl/certs/itim-self.req
Une fois le certificat signé par l'autorité, on l'intègre dans la key database :
$IHS_HOME/bin/gsk7cmd -cert -receive -file /tmp/myNewCert.pem -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer \
-format [ascii | binary] -default_cert [yes | no]
Par exemple :
$IHS_HOME/bin/gsk7cmd -cert -receive -file /etc/ssl/certs/itimserver.mycorp.com.pem \
-db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -format ascii -label "ITIM-Self-Service" -default_cert yes
Les options utilisées :
Il est possible de lister les certificats de la base :
bin/gsk7cmd -cert -list -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer
Certificates in database /etc/ssl/certs/ihs.kdb:
ITIM-Self-Service
On peut également avoir le détail, en précisant le libellé :
bin/gsk7cmd -cert -details -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -label ITIM-Self-Service
Libellé : ITIM-Self-Service
Taille de clé : 1024
Version : X509 V3
Numéro de série : 53 AA E8 E8
Emis par : CN=itimserver.mycorp.com, O=mycorp, C=FR
Sujet : CN=itimserver.mycorp.com, O=mycorp, C=FR
Valide : Du : mercredi 25 juin 2014 17 h 21 CEST au : samedi 22 juin 2024 17 h 21 CEST
Empreinte digitale : 3D:00:42:7C:FB:84:76:0B:C7:F3:05:59:E0:DD:72:08:B3:B6:8B:6A
Algorithme de signature : SHA1withRSA (1.2.840.113549.1.1.5)
Etat de confiance : activé
Il est également possible d'importer un certificat, uniquement au format PKCS12 ou KeyDatabase.
Dans ce cas, la commande à utiliser est :
bin/gsk7cmd -cert -import -file /le/chemin/vers/monfichier.p12 -target_type kdb -target /etc/ssl/certs/ihs.kdb -target_pw IBMHttpServer
Note : l'utilisation de gsk7cmd (qui encapsule du Java) peut conduire à une erreur de type :
The command cannot complete because your JRE is using restricted policy files.
Replace your policy files with the Unlimited Strength files.
On peut dans ce cas utiliser la commande gsk7capicmd, qui est un exécutable Linux. La syntaxe n'est pas la même :
bin/gsk7capicmd -cert -import -db /le/chemin/vers/monfichier.p12 -type pkcs12 -target_type cms -target "/etc/ssl/certs/ihs.kdb" -target_pw IBMHttpServer
Le fichier PKCS12 est protégé par un mot de passe, car il contient le certificat ET la clé privée.
Maintenant que nous avons un certificat, il faut activer le SSL sur le serveur, en activant plusieurs choses :
Ceci s'effectue dans le fichier de configuration $INS_HOME/conf/httpd.conf, dans lequel on ajoutera les lignes suivantes :
.../...
NameVirtualHost *:80
NameVirtualHost *:443
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
Listen 443
Les deux premières lignes permettent de gérer les VirtualHost sur les ports http et https (voir ci-dessous).
Le paramétrage s'effectue dans le fichier $INS_HOME/conf/httpd.conf, au niveau d'un VirtualHost. Par exemple :
<VirtualHost *:443>
ServerName myserver.mycorp.com
SSLEnable
KeyFile /etc/ssl/certs/ihs.kdb
LogLevel warn
ErrorLog logs/myserver-error.log
CustomLog logs/myserver-access.log common
</VirtualHost>
Pour le serveur myserver.mycorp.com, on active le SSL (paramètre SSLEnable), avec le fichier de base de données précisé par le paramètre keyFile
Lors de l'import d'une fichier pkcs12, si le label existe déjà (pour la remplacer par exemple) on a un message :
Error: 23
Please refer to the GSKCapiCmd User's Guide
for the meaning of the error.
Error id: GSKKM_ERR_DATABASE_DUPLICATE_KEY_LABEL
ou encore
Error: 2
Please refer to the GSKCapiCmd User's Guide
for the meaning of the error.
Dans ce cas, il faut d'abord supprimer l'ancien certificat, avec son label en paramètre :
bin/gsk7capicmd -cert -delete -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -label MaVieilleCle
Si en redémarrant IHS, on a dans le fichier log des lignes telles que :
[Fri Jun 27 16:00:23 2014] [error] [client 128.240.165.134] [864a618] SSL0208E: SSL Handshake Failed, Certificate validation error
Il s'agit d'un problème d'autorité de certification qui n'est pas reconnue. Ceci peut se vérifier avec la commande :
$IHS_HOME/bin/gsk7capicmd -cert -list -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer
Certificates found:
* default, - has private key, ! trusted
*-! ITIM-Self-Service
Le certificat existe, mais n'est pas digne de confiance...
Note : on utilise ici la commande gsk7capicmd, au lieu de gsk7cmd, mais les 2 commandes sont interchangeables.
Il faut alors ajouter dans la base de données la chaîne de certificats qui ont permis de signer notre certificat :
$IHS_HOME/bin/gsk7capicmd -cert -add -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer -label ChainCA -file /tmp/chain.pem
On peut alors vérifier que cela fonctionne :
bin/gsk7capicmd -cert -list -db /etc/ssl/certs/ihs.kdb -pw IBMHttpServer
Certificates found:
* default, - has private key, ! trusted
! ChainCA
*-! ITIM-Self-Service
Les références utilisées sont :