Mise en place d'un serveur CAS et d'un client mod-cas à l'INT

Jehan Procaccia MCI INT-EVRY- jehan.procaccia@int-evry.fr

7 mars 2005

Table des matières

Résumé : Ce document décrit la mise en place d'un serveur de Single Sign On (SSO) web : CAS, ainsi qu'un client (apache mod-cas) , sur le site de l'INT. Ce SSO se base sur des outils libres et est largement exploité par des Universités Americaines (Yale, recesencement en cours ...) ainsi que le portail de l'enseignement superieure en France; www.esup-portail.org. Des documentations tres instructives et completes existent déjà sur le sujet. Cependant, vu la difficulté que nous avons eu à le mettre en place à l'INT, nous tenions à conserver une trace des étapes pas à pas de mise en place de ce service.

1  Prérequis système et logiciel

Les operations realisées dans ce document se sont faites sur une système Linux Fedora Core 2, nous utilisons l'utilitaire yum pour le traitement d'installation automatique des packages RPM, ainsi que le repository jpackage www.jpackage.org pour les packages concernant Java.

1.1  Documentation et programmes de réference

L'installation du serveur CAS sera ici réalisée depuis la distribution esup-casgeneric http://esup-casgeneric.sourceforge.net/ Plus particulièrement nous utiliserons le package integré (serveur, generic-handler, tomcat) cas-quick-start http://esup-casgeneric.sourceforge.net/install-esup-cas-quick-start.html Un ensemble de documentation en francais est maintenue sur http://www.esup-portail.org/consortium/espace/SSO_1B/cas/ Le site source de CAS se trouve sur http://www.yale.edu/tp/auth/

1.2  Environement systeme jpackages

Installation du jdk, un certains nombre de dependances viennent automatiquement avec, dont jpckage-utils ant etc ....
$ yum install java-1.4.2-sun java-1.4.2-sun-devel
$ rpm -qa | grep jpacka
jpackage-utils-1.5.38-1jpp

$ rpm -qa | grep ant
ant-core-1.5.2-26
ant-1.5.2-26

Cependant d'apres la doc esup-casgeneric, il faut ant 1.6.1 ! A la date de redaction de cette documentation, cette version n'est disponible qu'en packages de developpement, nous l'installons donc à la main, depuis le site http://sunsite.rediris.es/mirror/jpackage/1.5/generic/RPMS.devel/
$ rpm -Uvh /root/ant-1.6.1-1jpp.noarch.rpm
attention: /root/ant-1.6.1-1jpp.noarch.rpm: signature V3 DSA: NOKEY, key ID c431416d
erreur: Dépendances requises:
        jaxp_parser_impl est nécessaire pour ant-1.6.1-1jpp
Le parser XML xerces fournis ce jaxp_parser_impl.jar !, il faut donc l'installer.
$ yum install xerces-j2

$ rpm -Uvh /root/ant-1.6.1-1jpp.noarch.rpm

2  Installation de esup-casgeneric


[root@tyr /var/lib/cas]
$ unzip esup-cas-quick-start-2.0.4-2.zip

2.1  Configuration

Adaptation à notre site de properties/build.properties, pour prendre en compte une authentification sur une base ldap munie de replicas ldap-rep.et création d'un certificat auto-signé provisoire, enfin définition du chemin de l'utilitaire keytool.
[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2]
$ diff -ur properties/build.properties.orig properties/build.properties

--- properties/build.properties.orig    2004-08-03 16:32:22.746923560 +0200
+++ properties/build.properties 2004-08-03 16:37:57.314061624 +0200
@@ -16,7 +16,7 @@
 # To add a new authentication mode, simply add a directory to custom/esup-casgeneric-auth
 #
  
-esup-casgeneric.auth=test
+esup-casgeneric.auth=ldap-rep
  
 #====================================================================
 # NIS authentication
@@ -45,10 +45,10 @@
 #====================================================================
 # Simple (fastbind) LDAP authentication with a replica (used when ${esup-casgeneric.auth} = ldap-rep)
  
-#esup-casgeneric.auth=ldap-rep
-#esup-casgeneric.auth.ldap-rep.filter=uid=%u,ou=people,dc=esup-portail,dc=org
-#esup-casgeneric.auth.ldap-rep.url1=ldap://ldap.esup-portail.org
-#esup-casgeneric.auth.ldap-rep.url2=ldap://ldap2.esup-portail.org:390
+esup-casgeneric.auth=ldap-rep
+esup-casgeneric.auth.ldap-rep.filter=uid=%u,ou=people,dc=int-evry,dc=fr
+esup-casgeneric.auth.ldap-rep.url1=ldap://ldap1.int-evry.fr
+esup-casgeneric.auth.ldap-rep.url2=ldap://ldap2.int-evry.fr
  
 #====================================================================
 # Complex (search, then bind) LDAP authentication
@@ -110,13 +110,13 @@
 #
 # if you use a relative path, it will be relative to your servet container's root directory.
  
-#esup-casgeneric.log.path=logs/esup-casgeneric.log
+esup-casgeneric.log.path=logs/esup-casgeneric.log
  
 #====================================================================
 # CAS Generic Handler log (log4j) level
 #
  
-#esup-casgeneric.log.level=INFO
+esup-casgeneric.log.level=INFO
  
 #====================================================================
 # CAS Server version
@@ -145,7 +145,7 @@
 # file to custom/cas-server-render
 #
  
-#cas-server.render=esup-portail.org
+cas-server.render=int-evry.fr
  
 #====================================================================
 # Jakarta Tomcat location
@@ -163,8 +163,8 @@
 # port CAS will be listenig to
 #
  
-#jakarta-tomcat.port.shutdown=8005
-#jakarta-tomcat.port.https=8443
+jakarta-tomcat.port.shutdown=8005
+jakarta-tomcat.port.https=8443
  
 #====================================================================
 # properties for the server certificate
@@ -192,13 +192,13 @@
 # otherwise, set these ones:
  
 jakarta-tomcat.keystore.genkey=true
-jakarta-tomcat.keystore.alias=jakarta-tomcat
-jakarta-tomcat.keystore.storepass=secret
+jakarta-tomcat.keystore.alias=jakarta-tomcat-cas2
+jakarta-tomcat.keystore.storepass=changeit
 jakarta-tomcat.keystore.keypass=${jakarta-tomcat.keystore.storepass}
 jakarta-tomcat.keystore.keyalg=RSA
-jakarta-tomcat.keystore.dname.cn=localhost
-jakarta-tomcat.keystore.dname.ou=v
-jakarta-tomcat.keystore.dname.o=Esup-Portail.Org
+jakarta-tomcat.keystore.dname.cn=cas2.int-evry.fr
+jakarta-tomcat.keystore.dname.ou=MCI
+jakarta-tomcat.keystore.dname.o=INT-EVRY
 jakarta-tomcat.keystore.dname.c=FR
  
 #
@@ -206,4 +206,5 @@
 #
  
 #jakarta-tomcat.keytool.path=${env.JAVA_HOME}/bin/keytool.exe
+jakarta-tomcat.keytool.path=/usr/bin/keytool

2.2  Personnalisation de la page de connexion, HTML rendering


$ cp -a esup-portail.org int-evry.fr
[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2/custom/cas-server-render]
$ cp esup-portail.org.properties int-evry.fr.properties

2.2.1  Copie du logo INT


$ scp /tmp/logo_int.png \
root@cas2:/var/lib/cas/esup-cas-quick-start-2.0.4-2/custom/cas-server-render/int-evry.fr/web/int-evry.png

2.2.2  Personnalisation de la page


[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2/custom/cas-server-render]
$ diff -ur esup-portail.org.properties int-evry.fr.properties
--- esup-portail.org.properties 2004-07-08 18:51:48.000000000 +0200
+++ int-evry.fr.properties      2004-08-03 17:05:45.021531552 +0200
@@ -6,22 +6,22 @@
  
 cas-server.html.font=Arial,Helvetica
  
-cas-server.html.caption=Service Central d'Authentification ESUP-Portail
+cas-server.html.caption=Service Central d'Authentification INT-Evry
  
 cas-server.html.title.text=Service Central d'Authentification
 cas-server.html.title.color=white
  
-cas-server.html.logo.url=esup-portail.png
-cas-server.html.logo.width=182
-cas-server.html.logo.height=68
+cas-server.html.logo.url=int-evry.png
+cas-server.html.logo.width=444
+cas-server.html.logo.height=152
  
 cas-server.html.body.bgcolor=#0044AA
 cas-server.html.box.bgcolor=#FFFFFF
 cas-server.html.error.color=red
 cas-server.html.credentials.color=#FF9999
 cas-server.html.warn.color=#003399
-cas-server.html.institution.name=consortium ESUP-Portail
-cas-server.html.institution.url=http://www.esup-portail.org
-cas-server.html.institution.url-pattern="https://xxx.esup-portail.org"
-cas-server.html.institution.web-pages=Les pages sécurisées du consortium ESUP-Portail
+cas-server.html.institution.name=GET, INT Evry
+cas-server.html.institution.url=http://www.int-evry.fr
+cas-server.html.institution.url-pattern="https://www.int-evry.fr"
+cas-server.html.institution.web-pages=Les pages sécurisées de l'INT Evry

2.3  Deploiement


[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2]
$ ant install
Buildfile: build.xml
 
unzip-jakarta-tomcat:
    [unzip] Expanding: /var/lib/cas/esup-cas-quick-start-2.0.4-2/packages/jakarta-tomcat-5.0.25.zip \
into /var/lib/cas/esup-cas-quick-start-2.0.4-2
 
patch-jakarta-tomcat:
     [copy] Copying 1 file to /var/lib/cas/esup-cas-quick-start-2.0.4-2/jakarta-tomcat-5.0.25
 
jakarta-tomcat-create-keystore:
     [exec] Génération de la paire de clés RSA à 1 024 bits et du certificat autosigné (MD5WithRSA)
     [exec]     pour : CN=cas2.int-evry.fr, OU=MCI, O=INT-EVRY, C=FR
     [exec] [Enregistrement de /var/lib/cas/esup-cas-quick-start-2.0.4-2/jakarta-tomcat-5.0.25/conf/server.ks]
 
 
    [mkdir] Created dir: /var/lib/cas/esup-cas-quick-start-2.0.4-2/tmp
     [exec] Certificat enregistré dans le fichier <tmp/cert.pkcs7>
 
 
     [exec] Certificat ajouté au Keystore
     [exec] [Enregistrement de jakarta-tomcat-5.0.25/conf/cacert.ks]
 
 
     [echo]
     [echo] Two keystores have been generated:
     [echo]   - /var/lib/cas/esup-cas-quick-start-2.0.4-2/jakarta-tomcat-5.0.25/conf/server.ks, used by Jakarta Tomcat;
     [echo]   - jakarta-tomcat-5.0.25/conf/cacert.ks, which can be trusted by clients to avoid usual warnings.
     [echo]
 
install:
 
unzip-cas-server:
    [unzip] Expanding: /var/lib/cas/esup-cas-quick-start-2.0.4-2/packages/cas-server-2.0.12.zip \
into /var/lib/cas/esup-cas-quick-start-2.0.4-2
 
customize-cas-server:
     [copy] Copying 3 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/cas-server-2.0.12
     [copy] Copying 9 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/cas-server-2.0.12
 
unzip-esup-casgeneric:
    [unzip] Expanding: /var/lib/cas/esup-cas-quick-start-2.0.4-2/packages/esup-casgeneric-2.0.4-2.zip \
into /var/lib/cas/esup-cas-quick-start-2.0.4-2
 
customize-esup-casgeneric:
     [copy] Copying 1 file to /var/lib/cas/esup-cas-quick-start-2.0.4-2/esup-casgeneric-2.0.4-2
     [copy] Copying 1 file to /var/lib/cas/esup-cas-quick-start-2.0.4-2/esup-casgeneric-2.0.4-2
 
deploy-esup-casgeneric:
 
deploy:
     [copy] Copying 33 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/cas-server-2.0.12/src
     [copy] Copying 2 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/cas-server-2.0.12/web
     [copy] Copying 2 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/cas-server-2.0.12/web
 
build-cas-server:
    [mkdir] Created dir: /var/lib/cas/esup-cas-quick-start-2.0.4-2/build/WEB-INF/classes
    [javac] Compiling 63 source files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/build/WEB-INF/classes
     [copy] Copying 18 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/build
 
deploy-cas-server:
    [mkdir] Created dir: /var/lib/cas/esup-cas-quick-start-2.0.4-2/jakarta-tomcat-5.0.25/webapps/cas
     [copy] Copying 85 files to /var/lib/cas/esup-cas-quick-start-2.0.4-2/jakarta-tomcat-5.0.25/webapps/cas
     [echo]
     [echo] ESUP-Portail CAS quick start is now installed.
     [echo] You can start the Jakarta Tomcat server by using the tomcat-start target and test https://localhost:8443/cas
     [echo]
 
BUILD SUCCESSFUL
Total time: 12 seconds

2.4  Firewall

Edition des règles de firewall pour accespter la connexion sur le serveur CAS, port 8443, ajout de la ligne suivante dans /etc/sysconfig/iptables et redemarrage du firewall.
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8443 -j ACCEPT
$ /etc/init.d/iptables restart
Suppression des règles de pare-feu :                       [  OK  ]
Configuration des chaînes sur la politique ACCEPT :filter  [  OK  ]
Déchargement des modules iptables :                        [  OK  ]
Application des règles de pare-feu iptables :              [  OK  ]
Chargement des modules iptables supplémentaires :ip_conntra[  OK  ]a

2.5  Démarrage du serveur


[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2]
$ ant tomcat-start

2.6  Test de connexion


https://cas2.int-evry.fr:8443/

2.7  Test d'authentification


https://cas2.int-evry.fr:8443/cas/

exception

org.apache.jasper.JasperException: Impossible de compiler la classe pour la JSP

No Java compiler was found to compile the generated source for the JSP. 

Ce premier test echoue ! en effet par défaut l'environement d'execution de l'application CAS au sein de tomcat ne réference pas correctement le JAVA_HOME d'où l'erreure à propos du compilateur java non trouvé. Il doit y avoir moyen de configurer ceci proprement dans un fichier de configuration tomcat, mais ... ici j'exporte tout simpelemnt la variable JAVA_HOME telle qu'elle est definie par jpackage-utils dans /etc/java/java.conf avant de lancer le serveur tomcat.
$ grep JAVA_HOME /etc/java/java.conf
JAVA_HOME_LIST=$JAVA_LIBDIR-utils/java_home.list
JAVA_HOME=$JVM_ROOT/java

$ export JAVA_HOME=/usr/lib/jvm/java

[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2]
$ ant tomcat-start

Maintenant https://cas2.int-evry.fr:8443/cas/ fonctionne !.

2.8  Demarrage automatique du service

Nous integrons le demarrage de ce service dans le systeme de demarrage automatique RedHat, cf chkconfig

[root@tyr /etc/rc.d/init.d]
$ chkconfig --level 345 cas-esup on
[root@tyr /etc/rc.d/init.d]
$ chkconfig --list | grep cas
cas-esup        0:Arrêt 1:Arrêt 2:Arrêt 3:Marche        4:Marche        5:March6:Arrêt

Script de démarrage.
[root@tyr /etc/rc.d/init.d]
$ cat cas-esup
#!/bin/sh
#
# "$Id: serveur-cas-client-mod-cas.tex,v 1.4 2005/05/13 17:19:10 jehan Exp $"
#
#   Startup/shutdown script for the Cas server.
#
#   Linux chkconfig stuff:
#
#   chkconfig: 2345 87 13
#   description: Startup/shutdown script for Cas server \
#
#   Copyright 1997-2000 by Easy Software Products, all rights reserved.
#
 
# Source function library.
if [ -f /etc/init.d/functions ] ; then
        . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
else
        exit 0
fi
 
prog=/usr/bin/ant
 
start () {
        echo -n $"Starting Tomcat-esup: "
 
        config
 
        # start daemon
        cd /var/lib/cas/esup-cas-quick-start-2.0.4-2; $prog tomcat-start & 2>&1
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat
        return $RETVAL
}
 
stop () {
        # stop daemon
        echo -n $"Stopping Tomcat-esup: "
        cd /var/lib/cas/esup-cas-quick-start-2.0.4-2; $prog tomcat-stop 2>&1
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat
}
 
restart() {
        stop
        start
}
 
case $1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                restart
        ;;
        status)
                ps auwx | grep tomcat
        ;;
        *)
 
        echo $"Usage: $prog {start|stop|restart|status}"
        exit 1
esac
 
exit $RETVAL

3  Certificats et confiance

3.1  Problématique

Comme le certificat de tomcat à été auto-signé, nous allons avoir un probleme de confiance entre ce certificat et le client mod-cas sur le serveur apache:
/var/log/httpd/error_log:

[Wed Aug 04 11:40:19 2004] [error] mod_cas: certificate error: bad cert or
verisignserverca.pem is not available.\n

En effet le navigateur reçoit un error 500 Internal Server Error

Il faut que le serveur CAS et le serveur apache + mod_cas se fassent confiance, pour cela nous allons signer le certificat de CAS et celui du serveur apache par une meme autorité de certification (mciCA, CA de test interne à l'INT !)

4  Certificat signé par une autorité locale

Apres de nombreux deboires, voir thread ayant pour sujet "Certificat du serveur CAS" sur la liste cas-fr@esup-portail.org, nous suivons la procedure decrite sur http://esup-portail.org/consortium/espace/SSO_1B/tech/java/java_x509.html#SignCALocale couplée à une doc soumise à FAQ (peux évoluer !) sur http://www.cru.fr/faqdata/cache/81.html

4.1  Bi-clé

On génère la paire de clés et le certificat autosigné. Attention à l'alias choisi (cas6 ici , 6eme essais ! ;-( ), il faudra respecter le même nom d'alias lors de l'import de la chaine de certification.
[root@tyr /etc/x509]
$ keytool -genkey -alias cas6 -keyalg RSA -storepass changeit
-keystore cas6.keystore
Quels sont vos prénom et nom ?
  [Unknown] :  cas2.int-evry.fr
Quel est le nom de votre unité organisationnelle ?
  [Unknown] :  MCI
Quelle est le nom de votre organisation ?
  [Unknown] :  GET INT
Quel est le nom de votre ville de résidence ?
  [Unknown] :  Evry
Quel est le nom de votre état ou province ?
  [Unknown] :  Essonne
Quel est le code de pays à deux lettres pour cette unité ?
  [Unknown] :  FR
Est-ce CN=cas2.int-evry.fr, OU=MCI, O=GET INT, L=Evry, ST=Essonne, C=FR ?
  [non] :  oui
 
Spécifiez le mot de passe de la clé pour <cas6>
        (appuyez sur Entrée s'il s'agit du mot de passe du Keystore) :

4.2  Demande de signature de certificat

On génère une requête de certificat :
[root@tyr /etc/x509]
$ keytool -certreq -alias cas6 -storepass changeit -keystore
cas6.keystore -file cas6.csr

Transfert de la requeste (.csr) au serveur PKI . Il s'agit d'une PKI perl CSP à l'INT, cf: http://www.int-evry.fr/s2ia/user/procacci/Doc/openssl.html chapitre 5.
$ scp cas6.csr root@crotale2:/home/pkiadm/ca/csp/mciCA/tmp

Sur le serveur PKI, signature à la csp ...
[pkiadm@crotale2 ~/ca/csp/mciCA]
$ csp mciCA sign --type=server --verbose --csrfile=./tmp/cas6.csr

transfert (retour) du certificat signé

[pkiadm@crotale2 ~/ca/csp/mciCA/certs]
$ scp 29.pem root@cas2:/etc/x509/

4.3  Manipulation sur le certificat signé

Copie de l'originale et édition de la copie afin de retirer toute la description qui se trouve avant le ----BEGIN CERTIFICATE ----
$ cp 29.pem cas6.pem
[root@tyr /etc/x509]
$ vi cas6.pem

Autrement l'utilitaire keytool ne le reconnais pas :
[root@tyr /etc/x509]
$ keytool -printcert -file 29.pem
sun.security.pkcs.ParsingException: Sequence tag error
        at sun.security.pkcs.PKCS7.parse(PKCS7.java:118)
        at sun.security.pkcs.PKCS7.<init>(PKCS7.java:68)
        at
sun.security.provider.X509Factory.parseX509orPKCS7Cert(X509Factory.java:530)
        at
sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.java:407)
        at
java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.java:511)
        at sun.security.tools.KeyTool.doPrintCert(KeyTool.java:1021)
        at sun.security.tools.KeyTool.doCommands(KeyTool.java:539)
        at sun.security.tools.KeyTool.run(KeyTool.java:124)
        at sun.security.tools.KeyTool.main(KeyTool.java:118)
Caused by: java.io.IOException: Sequence tag error
        at
sun.security.util.DerInputStream.getSequence(DerInputStream.java:266)
at sun.security.pkcs.ContentInfo.<init>(ContentInfo.java:115)
        at sun.security.pkcs.PKCS7.parse(PKCS7.java:136)
        at sun.security.pkcs.PKCS7.parse(PKCS7.java:115)
        ... 8 more
erreur keytool : java.lang.Exception: L'analyse de l'entrée a échoué

4.4  Verification


[root@tyr /etc/x509]
$ keytool -printcert -file cas6.pem
Propriétaire : CN=cas2.int-evry.fr, OU=MCI, O=INT GET Evry, L=Evry,
ST=Essonne, C=FR
Émetteur : C=FR, O=INT, CN=MCI Certificate Authority
Numéro de série : 29
Valide du : Fri Jul 16 13:02:21 CEST 2004 au : Sat Jul 16 13:02:21 CEST 2005
Empreintes de certificat :
         MD5 :  CB:8E:99:18:40:61:DE:41:4D:66:B5:48:70:64:7C:3C
         SHA1: F8:78:7C:47:DC:DB:17:27:32:7C:F5:4D:78:D9:E0:8F:69:A3:16:05

4.5  Création de la chaine de certification

On concatene ce certificat , suivis de celui de la CA ( cet ordre est important), pour créer une chaine de certification . Attention, ici par rapport à la doc esup-portail, je ne fais pas un echo (saut de ligne) entre les 2 certificats, c'est important , autrement l'utilitaire keytool ne reconnais pas la chaine. Cela est fait,(echo), sur le doc esup-portail, car les certificats délivrés par le CRU ne disposent pas de retour chariot en fin de ligne ! ils se retrouvaient alors avec ce genre de syntaxe -----END CERTIFICATE--------BEGIN CERTIFCATE----- :-( .
[root@tyr /etc/x509]
$ (cat cas6.pem ; cat ca.crt ) > cas6-chain.pem
[root@tyr /etc/x509]

[root@tyr /etc/x509]
$ keytool -printcert -file cas6-chain.pem
Certificat[1]:
Propriétaire : CN=cas2.int-evry.fr, OU=MCI, O=INT GET Evry, L=Evry, ST=Essonne, C=FR
Émetteur : C=FR, O=INT, CN=MCI Certificate Authority
Numéro de série : 29
Valide du : Fri Jul 16 13:02:21 CEST 2004 au : Sat Jul 16 13:02:21 CEST 2005
Empreintes de certificat :
         MD5 :  CB:8E:99:18:40:61:DE:41:4D:66:B5:48:70:64:7C:3C
         SHA1: F8:78:7C:47:DC:DB:17:27:32:7C:F5:4D:78:D9:E0:8F:69:A3:16:05
                                                                                
Certificat[2]:
Propriétaire : C=FR, O=INT, CN=MCI Certificate Authority
Émetteur : C=FR, O=INT, CN=MCI Certificate Authority
Numéro de série : 0
Valide du : Thu Jan 08 16:25:25 CET 2004 au : Sun Jan 07 16:25:25 CET 2007
Empreintes de certificat :
         MD5 :  95:35:93:CD:99:2A:F6:D9:2B:67:2E:65:89:19:60:A3
         SHA1: 67:99:38:86:29:36:8D:2B:90:5F:AA:F6:DF:5D:79:DD:04:DB:3B:57

4.6  Importation de la chaine dans le keystore

Maintenant il faut importer cette chaine de certification dans le keystore. Attention à bien reprendre le même nom d'alias que celui declaré lors de la création de la bi-clé et du certificat auto-signé lors de la premiere étape (Créaqtion de la bi-clé), ici cas6 !.
[root@tyr /etc/x509]
$ keytool -import -alias cas6 -trustcacerts -file cas6-chain.pem -keystore cas6.keystore
Tapez le mot de passe du Keystore :  changeit
                                                                            
Certificat du plus haut niveau dans la réponse :
                                                                                
Propriétaire : C=FR, O=INT, CN=MCI Certificate Authority
Émetteur : C=FR, O=INT, CN=MCI Certificate Authority
Numéro de série : 0
Valide du : Thu Jan 08 16:25:25 CET 2004 au : Sun Jan 07 16:25:25 CET 2007
Empreintes de certificat :
         MD5 :  95:35:93:CD:99:2A:F6:D9:2B:67:2E:65:89:19:60:A3
         SHA1: 67:99:38:86:29:36:8D:2B:90:5F:AA:F6:DF:5D:79:DD:04:DB:3B:57
                                                                                
... n'est pas digne de confiance. Installer la réponse quand même ? [non] : oui

Réponse de certificat installée dans le Keystore

4.7  Verification détaillée du keystore final


[root@tyr /etc/x509]
$ keytool -v -list -keystore cas6.keystore
Tapez le mot de passe du Keystore :  changeit
                                                                                
Type Keystore : jks
Fournisseur Keystore : SUN
                                                                                
Votre Keystore contient 1 entrée(s)
                                                                                
Nom d'alias : cas6
Date de création : 7 août 2004
Type d'entrée : keyEntry
Longueur de chaîne du certificat : 2
Certificat[1]:
Propriétaire : CN=cas2.int-evry.fr, OU=MCI, O=INT GET Evry, L=Evry, ST=Essonne, C=FR
Émetteur : C=FR, O=INT, CN=MCI Certificate Authority
Numéro de série : 29
Valide du : Fri Jul 16 13:02:21 CEST 2004 au : Sat Jul 16 13:02:21 CEST 2005
Empreintes de certificat :
         MD5 :  CB:8E:99:18:40:61:DE:41:4D:66:B5:48:70:64:7C:3C
         SHA1: F8:78:7C:47:DC:DB:17:27:32:7C:F5:4D:78:D9:E0:8F:69:A3:16:05
Certificat[2]:
Propriétaire : C=FR, O=INT, CN=MCI Certificate Authority
Émetteur : C=FR, O=INT, CN=MCI Certificate Authority
Numéro de série : 0
Valide du : Thu Jan 08 16:25:25 CET 2004 au : Sun Jan 07 16:25:25 CET 2007
Empreintes de certificat :
         MD5 :  95:35:93:CD:99:2A:F6:D9:2B:67:2E:65:89:19:60:A3
         SHA1: 67:99:38:86:29:36:8D:2B:90:5F:AA:F6:DF:5D:79:DD:04:DB:3B:57
                                                                                
                                                                                
*******************************************
*******************************************
                                                                                

4.8  Configurer tomcat pour lire ce keystore et redemarrer le serveur tomcat


$ grep cas6.keystore /var/lib/cas/esup-cas-quick-start-2.0.4-2/jakarta-tomcat-5.0.25/conf/server.xml
               keystoreFile="/etc/x509/cas6.keystore"


[root@tyr /var/lib/cas/esup-cas-quick-start-2.0.4-2]
$ ant tomcat-stop
$ ant tomcat-start

4.9  Test de connexion https sur cas

Verifier que l'on a bien affaire à un certificat signé par notre autoritée (Issued by MCI CA !)

Detail du certificat , sur la chaine ( 2 niveaux seulement ici !) de certification.

5  Exploitation par un client Apache mod-cas

5.1  Choix de la distribution du module cas

5.1.1  Site source, Yale

Le module apache CAS est disponible depuis le site de Yale dans l'archive cas-client-2.0.10.tar.gz. Cependant , lors de la redaction de ce document, ce module n'intègre pas le patch d'esup-portail qui permet de le parametrer au travers de directive Apaches, plutot que dans un fichier d'include (cas.h), ce qui implique une recompilation à chaque modification sur le nom du serveur cas, son port d'excution, les certificat de confiance etc ...

5.1.2  Esup-portail

Pascal Aubry (Rennes) propose une version patchée (mod_cas-20030627-1334-esup.tar.gz) contenant ces ameliorations. Helas je n'ai pu l'exploiter correctement à cause d'un obscure probleme de librairie cURL . Voir http://www.esup-portail.org/consortium/espace/SSO_1B/tech/cas/mod_cas/server_config.html pour les apports de ce patch.
Erreur obtenue

$ /etc/init.d/httpd start
Starting httpd: Syntax error on line 198 of /etc/httpd/conf/httpd.conf:
Cannot load /etc/httpd/modules/mod_cas.so into server:
/etc/httpd/modules/mod_cas.so: undefined symbol: curl_easy_setopt
                                                         [FAILED] 

Probablement un probleme de link avec la librairie curl, il manquerai un -lcurl dans un Makefile quelque part ? ...

5.1.3  Package INT

Finalement, j'ai utilisé une autre version du patch, fournie par vincent Mathieu (Nancy), et confectionné mon propre package RPM Apache (voir disponibilité ci-dessous)

5.1.4  Patch mod-cas

http://www.int-evry.fr/mci/user/procacci/SRPMS/mod_cas.patch

5.1.5  Application du Patch à la distribution de Yale


[root@petra /tmp]
$ tar xfz cas-client-2.0.10.tar.gz
[root@petra /tmp]
$ cp -a cas-client-2.0.10/mod_cas/apache2/ ./cas-yale
[root@petra /tmp]
$ patch -p0 < mod_cas.patch
patching file cas-yale/cas.h
patching file cas-yale/mod_cas.c
patching file cas-yale/mod_cas.la
patching file cas-yale/modules.mk
patching file cas-yale/ssl_client.c
[root@petra /tmp]
$ mv cas-yale/ cas
[root@petra /tmp]
$ tar cvfz /usr/src/redhat/SOURCES/mod_cas.tar.gz cas/
cas/
cas/mod_dir.c
cas/mod_cas.lai
cas/mod_cas.c
cas/Makefile.in
cas/ticketcache.h
cas/config.m4
cas/mod_cas.la
cas/verisignserverca.pem
cas/README
cas/libcas.exp
cas/ssl_client.c
cas/modules.mk
cas/cas.h

5.1.6  Fichier de spec RPM Apache modifié pour intégrer mod-cas

Modification sur le fichier de Specification (.spec)
[root@petra /usr/src/redhat/SPECS]
$ diff -ur httpd-2.0.50-2.1.spec httpd-2.0.50-2.2.spec
--- httpd-2.0.50-2.1.spec       2004-06-29 18:07:55.000000000 +0200
+++ httpd-2.0.50-2.2.spec       2004-08-09 10:31:46.475210072 +0200
@@ -7,7 +7,8 @@
 Summary: Apache HTTP Server
 Name: httpd
 Version: 2.0.50
-Release: 2.1
+Release: 2.2
+Packager: jehan Procaccia <jehan.procaccia@int-evry.fr>
 URL: http://httpd.apache.org/
 Source0: http://www.apache.org/dist/httpd/httpd-%{version}.tar.gz
 Source1: index.html
@@ -21,6 +22,7 @@
 Source12: welcome.conf
 Source14: mod_ssl-Makefile.crt
 Source15: mod_ssl-Makefile.crl
+Source16: mod_cas.tar.gz
 # Documentation
 Source30: migration.xml
 Source31: migration.css
@@ -126,6 +128,9 @@
  
 %prep
 %setup -q
+cd modules
+tar -xzf $RPM_SOURCE_DIR/mod_cas.tar.gz
+cd ..
 %patch1 -p1 -b .apctl
 %patch2 -p1 -b .apxs
 %patch3 -p1 -b .linkmods
@@ -262,7 +267,8 @@
         --enable-cache --enable-mem-cache \
         --enable-file-cache --enable-disk-cache \
         --enable-ldap --enable-auth-ldap \
-        --enable-logio
+        --enable-logio \
+       --enable-cas=shared
  
 # To prevent most modules being built statically into httpd.worker,
 # easiest way seems to be enable them shared.
@@ -553,6 +559,10 @@
 %{_libdir}/httpd/build/libtool
  
 %changelog
+* Mon Aug 09 2004 Jehan Procaccia <jehan.procaccia@int-evry.fr> 2.0.50-2.2
+- add cas module: http://www.yale.edu/tp/cas/ + vincent mathieu patch
+
+
 * Tue Jun 29 2004 Joe Orton <jorton@redhat.com> 2.0.50-2.1
 - update to 2.0.50
 - mod_autoindex: don't truncate output on stat() failure (#126930)

5.1.7  Patch mod-dir

La Directive DirectoryIndex n'est plus honorée suite à la redirection engndrée par CAS. En fait le module mod_dir ne fonctionne pas par defaut sur les redirections (codes HTTP 30X ...). Il faut aussi patcher mod_dir

http://www.int-evry.fr/s2ia/user/procacci/SRPMS/httpd-2.0.50-mod_dir.patch

5.1.8  Update securité 2.0.52 + patch mod-dir et mod-cas

D'abord pour repondre aux avis du CERT, nous avons updater apache vers le 2.0.52 (d'autres viendrons ...) Ensuite nous avons modifié le .spec apache ci-dessus pour tenir compte du patch mod-dir:
Patch17: httpd-2.0.50-mod_dir.patch
%patch17 -p1 -b .mod_dir
%changelog
* Mon Oct 11 2004 Jehan Procaccia <Jehan.Procaccia@int-evry.fr> 2.0.52-3
- upgraded to 2.0.52
- add mod_dir patch for cas DirectoryIndex to work correctly
- add cas module: http://www.yale.edu/tp/cas/ + patch for configuring mod_cas at run-time: http://www.esup-portail.org/consortium/espace/SSO_1B/tech/cas/mod_cas/server_config.html

5.1.9  Disponibilité du package Apache + mod-cas + mod-dir

Package source http://www.int-evry.fr/s2ia/user/procacci/SRPMS/httpd-2.0.52-2.3.src.rpm Packages binaires pour FC2 http://www.int-evry.fr/s2ia/user/procacci/SRPMS/FC2

5.2  Nouvelle distribution du module cas

5.2.1  Nouveautés

Esup-portail distribut une nouvelle version du module CAS, basée sur la distribution cliente 2.0.11 de yale. Elle apporte, outre la mise à jour ! toujours une gestion sous forme de directives httpd.conf de la configuration CAS, mais aussi une reécriture totale des connexions https et une gestion des cookies permettant un bon fonctionnement du reverse-proxy, voir details sur: http://esup-portail.org/consortium/espace/SSO_1B/tech/cas/cas_modApache2.html

5.2.2  Préparation du package source

Extraction du module cas et recuperation du patch mod_dir (Vincent Mathieu) afin de l'appliquer directement sur les sources apache.
[root@calaz /tmp/Mod_cas-2.0.11-esup-1-RC1/sources]
$ tar cvfz /usr/src/redhat/SOURCES/mod_cas_2.0.11-esup-1-RC1.tgz cas
cas/
cas/README.yale
cas/Makefile.in
cas/mod_cas.c
cas/config.m4
cas/ssl_client.c
cas/modules.mk
cas/mod_cas.la
cas/ticketcache.h
cas/cas.h
cas/libcas.exp
cas/mod_cas.lai

$ cp /tmp/httpd-2.0.53-mod_dir.patch /usr/src/redhat/SOURCES/

5.2.3  Compilation et installation sous Fedora Core 2


$ rpmbuild -ba httpd-2.0.53-5.int.spec
$ rpm -Uvh /usr/src/redhat/RPMS/i386/httpd-2.0.53-5.int.i386.rpm /usr/src/redhat/RPMS/i386/httpd-suexec-2.0.53-5.int.i386.rpm /usr/src/redhat/RPMS/i386/httpd-manual-2.0.53-5.int.i386.rpm /usr/src/redhat/RPMS/i386/mod_ssl-2.0.53-5.int.i386.rpm
Préparation...              ########################################### [100%]
   1:httpd                  attention: /etc/httpd/conf/httpd.conf créé en tant que /etc/httpd/conf/httpd.conf.rpmnew
########################################### [ 25%]
   2:httpd-suexec           ########################################### [ 50%]
   3:httpd-manual           ########################################### [ 75%]
   4:mod_ssl                ########################################### [100%]
Attention une directive CAS a changé; CASTrustedCerts devient CASTrustedCACert !

5.2.4  Build sur une Fedora Core 3 vierge

Sur une FC3 avec le minimum d'installé, il faut ajouté pas mal de packages complementaires afin de pouvoir compiler ! -> cette experience permet de lister toute les dependances , cependant sur une installation relativement complete (avec les outils de developpement notament) tout ceci sera inutile .
# yum install rpm-build

# cd /usr/src/redhat/SPECS/
# rpmbuild -ba httpd-2.0.53-5.int.spec
erreur: Dépendances de construction manquantes:
        db4-devel est nécessaire pour httpd-2.0.53-5.int.i386
        expat-devel est nécessaire pour httpd-2.0.53-5.int.i386
        pkgconfig est nécessaire pour httpd-2.0.53-5.int.i386
        xmlto >= 0.0.11 est nécessaire pour httpd-2.0.53-5.int.i386
        apr-devel >= 0.9.4-20 est nécessaire pour httpd-2.0.53-5.int.i386
        apr-util-devel est nécessaire pour httpd-2.0.53-5.int.i386
        pcre-devel >= 5.0 est nécessaire pour httpd-2.0.53-5.int.i386
        openssl-devel est nécessaire pour httpd-2.0.53-5.int.i386
        distcache-devel est nécessaire pour httpd-2.0.53-5.int.i386
[root@sonde SPECS]# yum install db4-devel expat-devel pkgconfig xmlto apr-devel apr-util-devel pcre-devel openssl-devel distcache-devel
Performing the following to resolve dependencies:
  Install: cyrus-sasl-devel.i386 0:2.1.19-3
  Install: dialog.i386 0:1.0.20040731-3
  Install: distcache.i386 0:1.4.5-6
  Install: docbook-dtds.noarch 0:1.0-25
  Install: docbook-style-xsl.noarch 0:1.65.1-2
  Install: e2fsprogs-devel.i386 0:1.35-11.2
  Install: krb5-devel.i386 0:1.3.6-2
  Install: netpbm.i386 0:10.25-2
  Install: netpbm-progs.i386 0:10.25-2
  Install: openjade.i386 0:1.3.2-14
  Install: openldap-devel.i386 0:2.2.13-2
  Install: passivetex.noarch 0:1.25-3
  Install: psutils.i386 0:1.17-23
  Install: sgml-common.noarch 0:0.6.3-17
  Install: tetex.i386 0:2.0.2-21.3
  Install: tetex-dvips.i386 0:2.0.2-21.3
  Install: tetex-fonts.i386 0:2.0.2-21.3
  Install: tetex-latex.i386 0:2.0.2-21.3
  Install: xml-common.noarch 0:0.6.3-17
  Install: xmltex.noarch 0:20020625-3
Is this ok [y/N]:

# rpmbuild -ba httpd-2.0.53-5.int.spec
erreur: Dépendances de construction manquantes:
        pcre-devel >= 5.0 est nécessaire pour httpd-2.0.53-5.int.i386
# rpm -ivh /root/pcre-5.0-4.src.rpm
   1:pcre                   ########################################### [100%]
# yum install gcc-c++
[root@sonde SPECS]# rpmbuild -ba pcre.spec
# rpm -Uvh /usr/src/redhat/RPMS/i386/pcre-5.0-4.i386.rpm /usr/src/redhat/RPMS/i386/pcre-devel-5.0-4.i386.rpm
# yum install autoconf

[root@sonde SPECS]# rpmbuild -ba httpd-2.0.53-5.int.spec
# cd  /usr/src/redhat/RPMS/i386/
# rpm -Uvh httpd-2.0.53-5.int.i386.rpm httpd-manual-2.0.53-5.int.i386.rpm mod_ssl-2.0.53-5.int.i386.rpm httpd-suexec-2.0.53-5.int.i386.rpm
Préparation...              ########################################### [100%]
   1:httpd-suexec           ########################################### [ 25%]
   2:httpd                  attention: /etc/httpd/conf/httpd.conf créé en tant que /etc/httpd/conf/httpd.conf.rpmnew
########################################### [ 50%]
   3:httpd-manual           ########################################### [ 75%]
   4:mod_ssl                ########################################### [100%]

5.2.5  Disponibilité package Apache 2.0.53 + mod-cas 2.0.11 + mod-dir

Package source http://www.int-evry.fr/s2ia/user/procacci/SRPMS/httpd-2.0.53-5.int.src.rpm Packages binaires pour FC2 http://www.int-evry.fr/s2ia/user/procacci/SRPMS/FC2 Packages binaires pour FC3 http://www.int-evry.fr/s2ia/user/procacci/SRPMS/FC3

5.3  Configuration httpd

Modifications dans le fichier de configuration Apache; httpd.conf
LoadModule cas_module modules/mod_cas.so

<IfModule mod_cas.c>
   CASLocalCacheInsecure On
   CASLocalCacheFile /tmp/CAScache
   CASLocalCacheSize 1000
   CASLocalCacheTimeout 3600
   CASTrustedCerts /etc/x509/ca.crt
# Attention avec le package httpd-2.0.53 ci-dessus cette directive devient CASTrustedCACert
   CASLoginURL https://cas2.int-evry.fr:8443/cas
   CASHost cas2.int-evry.fr
   CASPort 8443
   CASMethod GET
   CASValidate /cas/validate
</IfModule>

5.4  Test du module Apache CAS

5.4.1  Controle d'acces .htaccess et page de test


[root@petra /var/www/html/test]
$ cat .htaccess
<Limit GET POST>
 AuthType CAS
 AuthName "INT auth"
 deny from all
 Require valid-user
 satisfy any
 </Limit>


$ cat test.php
<?php
print "<H1>l'utilisateur est ";
print $_SERVER["REMOTE_USER"];
print " </H1>";
?>

5.4.2  Test

Requete

Résultat



Ce document a été traduit de LATEX par HEVEA.