Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
olivier pontier
Intégration de CAS SSO avec Liferay
July 8, 2008 2:22 AM
Answer

olivier pontier

Rank: New Member

Posts: 4

Join Date: March 14, 2008

Recent Posts

Bonjour,

J'ai lu plusieurs posts sur l'intégration de CAS avec LIFERAY, cependant j'ai toujours le même problème qui persiste.

Ma configuration serveur :
- Une distribution Debian
- Tomcat 5.5 combiné avec Apache 2.2 en utilisant un connecteur AJP13
- Java 1.5
- Les ports 8443 et 8180, sur lesquels Tomcat tournent, sont bien ouverts
- Liferay 4.4.2 (je passe par l'environnement EXT pour modifier mon instance de Liferay avant de la déployer sur mon serveur applicatif Tomcat)

J'explique ci-dessous la démarche que j'ai suivie pour ensuite vous expliquer mon problème.

1) - Création du certificat avec keytool :


###########################################################
## Pages de référence : ####
## http://www.esup-portail.org/consortium/espace/SSO_1B/tech/java/java_x509.html ####
## http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html ####
###########################################################



## Suppression de l'alias TOMCAT du keystore personnel et du keystore global de java, s'il existe déjà ##
$JAVA_HOME/bin/keytool -delete -keystore demo-onext.com.keystore -alias demo-onext.com
$JAVA_HOME/bin/keytool -delete -keystore .keystore -alias demo-onext.com
$JAVA_HOME/bin/keytool -delete -keystore $JAVA_HOME/jre/lib/security/cacerts -alias demo-onext.com

## Génération d'un certificat auto-signé RSA ##
$JAVA_HOME/bin/keytool -genkey -alias demo-onext.com -keyalg RSA -keypass mykeypass -storepass mystorepass -keystore demo-onext.com.keystore -validity 1080


## Informations à rentrer ##
Quels sont vos prénom et nom ?
: demo-onext.com
Quel est le nom de votre unité organisationnelle ?
: Onext
Quelle est le nom de votre organisation ?
: Groupe Sodifrance
Quel est le nom de votre ville de résidence ?
: Nantes
Quel est le nom de votre état ou province ?
: Loire-Atlantique
Quel est le code de pays à deux lettres pour cette unité ?
: FR


## Cela génère une paire de clé dans un certificat X509 auto-signé. Un mot de passe est spécifié pour protéger la clé (KeyPass), et un autre mot de passe est spécifié pour protéger le keyStore (StorePass).
Dans mon cas le sotrepass et le keypass sont identiques car j'ai eu des problèmes lorsqu'ils étaient différents.
##


##J'ai pu vérifier ce certificat ##
$JAVA_HOME/bin/keytool -list -v -keystore demo-onext.com.keystore

## Exportation d'un certificat (d'une clé publique) ##
$JAVA_HOME/bin/keytool -export -keystore demo-onext.com.keystore -alias demo-onext.com -storepass mystorepass -file demo-onext.com.crt

## J'ai pu contrôlé mon certificat ##
$JAVA_HOME/bin/keytool -list -v -keystore demo-onext.com.keystore

## J'ai ensuite importé mon certificat dans un truststore privé, spécifique à l'utilisation de mon Tomcat, différent du $JAVA_HOME/jre/lib/security/cacerts qui n'est pas conseillé d'utilisé pour des raisons de sécurité ##
$JAVA_HOME/bin/keytool -import -v -trustcacerts -file demo-onext.com.crt -alias demo-onext.com -keystore demo-onext.com.cacerts -keypass mykeypass -storepass mystorepass


2) - Configuration de Tomcat pour l'utilisation de SSL

## Configuration du fichier server.xml ##
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/root/demo-onext.com.keystore"
keystorePass="mykeypass"/>

## Ajout d'options à l'environnement JAVA dans le fichier : /tomcat5.5/bin/setenv.sh ##
$CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.trustStore=/root/demo-onext.com.cacerts -Djavax.net.ssl.trustStorePassword=mystorepass"


3) - Test du fonctionnement de Tomcat avec SSL
J'ouvre mon navigateur Web et je rentre mon adresse Web : https://demo-onext.com:8443/
J'accepte le certificat.
La page d'accueil de Tomcat s'ouvre bien (/tomcat5.5/webapps/ROOT/index.jsp).
Jusqu'à présent tout se passe normalement.

4) - Installation du serveur CAS :

J'ai téléchargé le serveur CAS suivant : http://www.ja-sig.org/products/cas/downloads/index.html
J'ai renommé l'archive en cas-web.war et je l'ai déployé sur mon Tomcat

Mon serveur CAS est bien installé, je teste donc son fonctionnement avec sa procédure d'authentification de base (entrer un login et un mot de passe identiques pour être authentifié).

- Je me rends sur la page : https://demo-onext.com:8443/cas-web/login
- J'entre test / test, en login / mote de passe
- Je suis redirigé sur vers la page : https://demo-onext.com:8443/cas-web/login;jsessionid=2E810B51C9C1B2E15BB0ECB5FB25E4D3
et la page me confirme que je suis bien connecté :
" Connexion réussie
Vous vous êtes authentifié(e) auprès du Service Central d'Authentification. "
- Je regarde les logs de mon serveur CAS et je peux lire :

2008-07-08 07:54:00,663 INFO [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - 0 found to be removed. Removing now.
2008-07-08 07:54:00,663 INFO [org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner] - Finished cleaning of expired tickets from ticket registry at [Tue Jul 08 07:54:00 GMT 2008]
2008-07-08 08:15:21,483 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - AuthenticationHandler: org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler successfully authenticated the user which provided the following credentials: test

Mon serveur CAS semble bien fonctionné.

5) - Intégration du serveur CAS et de Liferay :

J'ajoute les lignes suivantes dans le fichier /portail-liferay/ext-impl/portal-ext.properties :

############################

com.liferay.filters.sso.cas.CASFilter=true
cas.auth.enabled=true

#
# Pour l'instant je ne veux pas utilisé l'authentification par LDAP mais juste tester avec l'authentification par défaut de CAS
#

cas.import.from.ldap=false

#
# Définition des urls utilisées par le serveur CAS pour l'authentification
#

cas.login.url=https://demo-onext.com:8443/cas-web/login
cas.logout.url=https://demo-onext.com:8443/cas-web/logout
cas.validate.url=https://demo-onext.com:8443/cas-web/proxyValidate

cas.server.name=demo-onext.com ## Je n'ajoute pas le port, car le connecteur AJP13 doit faire le pont entre les ports 8180 et 80

auto.login.hooks=com.liferay.portal.security.auth.CASAutoLogin

############################


6) - Test de l'authentification sous Liferay

- Je passe par le menu "ouvrir une session" (non par le portlet d'identification)
- Je suis bien redirigé vers la page de login de mon serveur CAS : https://demo-onext.com:8443/login
- J'entre test / test comme login / mot de passe, puis je valide

- Je suis redirigé vers la page : http://demo-onext.com/liferay/c/portal/login?ticket=ST-3-Mh0RnHS300ognB2DqaKEgdOKXg5vfaqFgbE-20

- J'obtiens alors les erreurs suivantes :

Etat HTTP 500 -

type Rapport d'exception

message

description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.

exception
javax.servlet.ServletException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:254)
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:149)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.sessionid.SessionIdFilter.doFilter(SessionIdFilter.java:81)


cause mère
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:70)
edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212)
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:219)
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:149)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.sessionid.SessionIdFilter.doFilter(SessionIdFilter.java:81)

cause mère
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
sun.security.validator.PKIXValidator.doBuild(Unknown Source)
sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
sun.security.validator.Validator.validate(Unknown Source)
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:70)
edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212)
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:219)
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:149)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.sessionid.SessionIdFilter.doFilter(SessionIdFilter.java:81)


cause mère
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
java.security.cert.CertPathBuilder.build(Unknown Source)
sun.security.validator.PKIXValidator.doBuild(Unknown Source)
sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
sun.security.validator.Validator.validate(Unknown Source)
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:70)
edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212)
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:219)
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:149)
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:98)
com.liferay.portal.servlet.filters.sessionid.SessionIdFilter.doFilter(SessionIdFilter.java:81)





7 ) - Mon problème et mes questions emoticon

Mon problème c'est que je n'arrive pas à identifier la source de ces exceptions.

En lisant ces logs et en regardant sur plusieurs forums le problème semble venir de mon certificat auto-signé, mais je l'ai recréé plusieurs fois en suivant les procédures indiquées et j'arrive toujours au même résultat.

Ai-je oublié une étape? Ai-je fait une (des) erreur(s) dans ma démarche?

Quelqu'un a t il déjà rencontré ce problème et trouvé une solution?

Sinon pourriez vous me donner des pistes pour me guider, sil vous plaît?
Jean-Sébastien Hederer
RE: Intégration de CAS SSO avec Liferay
July 9, 2008 7:39 AM
Answer

Jean-Sébastien Hederer

Rank: Junior Member

Posts: 72

Join Date: October 12, 2005

Recent Posts

nous en avons une version qui fonctionne sous 5.0 (chez ASPerience à Nantes,emoticonemoticon donc pas très loin de chez toi).

les problèmes de certificats sont assez durs à passer lorsque comme dans notre cas nous avons 2 serveurs séparés.

je vais voir si nous avons une doc présentable sur le sujet. si c'est pressé, tu dis à Christophe de m'appeler... emoticon
olivier pontier
RE: Intégration de CAS SSO avec Liferay
August 13, 2008 1:57 AM
Answer

olivier pontier

Rank: New Member

Posts: 4

Join Date: March 14, 2008

Recent Posts

Bonjour à tous,

N'ayant toujours pas trouver de solution à mon problème, je relance le post.
Juan Fernández
RE: Intégration de CAS SSO avec Liferay
November 17, 2008 9:58 AM
Answer

Juan Fernández

LIFERAY STAFF

Rank: Liferay Legend

Posts: 1262

Join Date: October 2, 2008

Recent Posts

Salut!
have you tried this? http://blogs.sun.com/andreas/entry/no_more_unable_to_find
I hope it works for you
Igor Barma
RE: Intégration de CAS SSO avec Liferay
January 6, 2011 1:31 AM
Answer

Igor Barma

Rank: New Member

Posts: 16

Join Date: September 30, 2009

Recent Posts

Bonjour,
une réponse avec 2 ans de délai!
Ce problème est lié au fait que dans un certificat auto-signé, il faut dans ce cas (intégration CAS) que le "ou" (organizational unit) de ton certificat soit égale au domaine de ton serveur (exemple.com).
Igor