Juste parce que je n’ai pas moyen de faire tourner une debian dans une VM sur mon desktop… Déjà que faire tourner un serveur d’appli c’est pas gagné.

Installation des prérequis

En gros, il s’agit du serveur d’authentification sur lequel les services renverront l’utilisateur. Pour simplifier, mon LDAP tournera sur la même machine.

Prérequis 1 : Un serveur d’appli Java

Parce que c’est plus fun, on le fait avec un jetty, ça me donne l’occase de regarder si c’est vraiment plus light que Tomcat. À la mode « le gars qui n’y connaît rien à java », j’installe la version fournie par ubuntu.

sudo aptitude install openjdk-6-jdk jetty
[...]
Le répertoire personnel `/usr/share/jetty' n'a pas été créé.
 * Not starting jetty - edit /etc/default/jetty and change NO_START to be 0 (or comment it out).
[...]

 

Ok, démarrons les hostilités : Le coup du « Le répertoire personnel n’a pas été créé » c’est de la flûte : c’est le adduser qui devrait dire « le répertoire existe déjà ». Pour la seconde ligne, ça parle de soit non ?

sudo sed -i "s/NO_START=1/NO_START=0/" /etc/default/jetty

Ok, facile à installer Jetty. C’est pour ça que les devs doivent aimer en fait.

 

Bon, je me suis fais avoir. Après une lecture plus attentive de la doc de shibboleth, il me faut une version de jetty comprise entre la 7.0 et la 7.3.0 Ni plus, ni moins… C’est fun java hein ?

C’est reparti (après avoir fait un purge de mon paquet jetty initialement installé).

sudo aptitude install openjdk-6-jdk

C’est parti à la recherche d’un jetty compatible. On va prendre la 7.3.0 dans le doute :

wget http://dist.codehaus.org/jetty/jetty-hightide-7.3.0/jetty-hightide-7.3.0.v20110203.tar.gz
wget -O - http://dist.codehaus.org/jetty/jetty-hightide-7.3.0/jetty-hightide-7.3.0.v20110203.tar.gz.md5 2>/dev/null
md5sum jetty-hightide-7.3.0.v20110203.tar.gz

On vérifie le résultat et on continue :

tar xvzf jetty-hightide-7.3.0.v20110203.tar.gz
sudo mv jetty-hightide-7.3.0.v20110203 /opt

vala… pas dur.

Prérequis 2 : un certificat ssl

Un petit rappel ne fait pas de mal, en plus sous ubuntu il n’y a rien à faire :

sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/localhost.pem

Il faut simplement indiquer ne nom d’hôte… facile non ?

Installation de l’IdP

Ok, on est dans le vif du sujet. Il s’agit d’une webapp, l’installation n’a donc aucun intérêt. Je prends la dernière version à ce jour :

wget http://www.shibboleth.net/downloads/identity-provider/latest/shibboleth-identityprovider-2.3.0-bin.zip
wget -O - http://www.shibboleth.net/downloads/identity-provider/latest/shibboleth-identityprovider-2.3.0-bin.zip.md5 2>/dev/null
md5sum shibboleth-identityprovider-2.3.0-bin.zip

On continue en extrayant le contenu de l’archive :

jar -xf shibboleth-identityprovider-2.3.0-bin.zip
cd shibboleth-identityprovider-2.3.0/
sudo sh ./install.sh

Ok si vous obtenez un :

Error: JAVA_HOME is not defined correctly.

Le truc habituel… le script d’installation vérifie que le fichier « /usr/bin/java » soit bien exécutable. Sauf que c’est un lien symbolique, donc il ne l’est pas. Le truc que je fais ? Je bourrine un peu en ajoutant cette ligne au début du script install.sh :

JAVA_HOME="/usr/lib/jvm/java-6-openjdk/jre"

On relance et on répond qu’on veut l’installer dans « /opt/shibboleth-idp » comme proposé par défaut (ça me va bien). On met à nouveau le nom d’hôte. Dernière question sur un mot de passe pour le keystore, attention, il s’affiche en clair quand vous le saisissez.

Maintenant on copie le war dans notre serveur d’appli, facile « cp » je commence à maîtriser j’crois :

sudo cp /opt/shibboleth-idp/war/idp.war /var/lib/jetty/webapps/

Et on déploie tout ça (magie des serveurs d’appli, toujours inconnue des admins classiques) :

sudo /etc/init.d/jetty start
tail -n 2000 -f /var/log/jetty/*.stderrout.log

Et VLAN, malédiction du java (c’est là ou un admin classique commence à rouspéter « java quelle daube ») : une stacktrace. Mais pour une fois c’est parlant : « Error creating bean with name ‘shibboleth.OpensamlConfig’ defined in URL [file:/opt/shibboleth-idp/conf/internal.xml]« … Il suffit de configurer notre nouveau joujou.

Un peu de doc : https://wiki.shibboleth.net/confluence/display/SHIB2/IdPJetty7Prepare

export JETTY_HOME=/opt/jetty-hightide-7.3.0.v20110203/
mkdir  $JETTY_HOME/lib/endorsed
ln -s /opt/shibboleth-idp/lib/*.jar $JETTY_HOME/lib/endorsed/
ln -s /opt/shibboleth-idp/lib/endorsed/* $JETTY_HOME/lib/endorsed/
cd $JETTY_HOME
echo "etc/shib-delegatessl.xml" >> start.ini
echo "-Djava.endorsed.dirs=${JETTY_HOME}lib/endorsed" >> start.ini
echo "-Xmx512m" >> start.ini # Ne pas hésiter à augmenter le 512 si on a plus de ram
echo "-XX:MaxPermSize=128m" >> start.ini

wget http://shibboleth.internet2.edu/downloads/maven2/edu/internet2/middleware/security/jetty7/jetty7-dta-ssl/1.0.0/jetty7-dta-ssl-1.0.0.jar -O ${JETTY_HOME}/lib/ext/jetty7-dta-ssl-1.0.0.jar

OK maintenant on créé le fichier $JETTY_HOME/etc/shib-delegatessl.xml et on le rempli avec les infos suivantes :

<Configure id="Server" class="org.eclipse.jetty.server.Server">

<Call name="addConnector">

<Arg>

<New class="edu.internet2.middleware.security.jetty7.DelegateToApplicationSslSelectChannelConnector">

<Set name="keystore">/opt/shibboleth-idp/credentials/idp.jks</Set>

<Set name="password">PASSWORD</Set>

<Set name="port">8443</Set>

<Set name="maxIdleTime">30000</Set>

<Set name="acceptors">2</Set>

<Set name="acceptQueueSize">100</Set>

</New>

</Arg>

</Call>

</Configure>

Cela est utilisé pour écouter les connexion directes des services providers qui ne passeront pas par le serveur web. Si vous voulez plus de détail, je vous redirige vers la doc de shibboleth. Attention : dans le fichier ci-dessus j’ai repris le chemin du répertoire d’installation de l’IdP de shibboleth, si vous n’avez pas le même, pensez à le changer. Il faut également changer le « PASSWORD » avec le mot de passe rentré pour le keystore lors de l’installation de l’IdP.

Presque fini : on déclare l’emplacement du war pour que Jetty le déploie. Il faut éditer le fichier $JETTY_HOME/contexts/idp.xml avec les informations suivantes :

<Configure class="org.eclipse.jetty.webapp.WebAppContext">

<Set name="war">/opt/shibboleth-idp/war/idp.war</Set>

<Set name="contextPath">/idp</Set>

<Set name="extractWAR">false</Set>

<Set name="copyWebDir">false</Set>

</Configure>

Attention : encore une fois vous retrouvez le « /opt/shibboleth-idp » dans le contenu du fichier.

OK gogogo !

sudo java -jar start.jar

Pour vérifier : https://localhost:8080/idp/profile/Status : si le mot « ok » apparaît, c’est gagné.

Il reste à configurer le tout. Et ça fera sans doutes l’objet de mon prochain article. Seule différence : je ferais peut-être les manips sur un tomcat, pas parce que je n’aime pas jetty, mais parce que tomcat est la brique « standard » là où je bosse. Enfin, je pense pas que ça change grand chose et je m’amuserai même sans doute à préconfigurer sur jetty pour valider sur tomcat.

 

To be continued.