1. 程式人生 > >基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入

基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入

基於CAS的單點登入SSO[4]: 加入兩個CAS客戶端測試單點登入 作者:家輝,日期:2017-08-22 CSDN部落格: http://blog.csdn.net/gobitan 摘要:本系列的前三篇文章分別搭建了基於CAS的單點登入伺服器,並讓伺服器支援MySQL儲存使用者名稱和密碼,以及讓Redis快取使用者認證資訊。本文將採用CAS官方提供的基於傳統WAR工程的CAS客戶端樣例來做單點登入測試。
環境概述
10.191.30.30 cas.example.org #CAS伺服器
10.191.30.31 casclient1.example.org #CAS客戶端1
10.191.30.32 casclient2.example.org #CAS客戶端2
10.191.13.98 瀏覽器所在主機

部署CAS客戶端1主機 第一步:獲取CAS客戶端部署包
git clone https://github.com/cas-projects/cas-sample-java-webapp

第二步:配置域名 在/etc/hosts中增加如下配置:
10.191.30.30 cas.example.org
10.191.30.31 casclient1.example.org
10.191.30.32 casclient2.example.org 
配置cas-sample-java-webapp/src/main/webapp/WEB-INF/web.xml 將所有8443前面預設的
mmoayyed.unicon.net
替換為:cas.example.org 將所有9443前面預設的 mmoayyed.unicon.net替換為:casclient1.example.org
第三步:建立客戶端證書
mkdir -p /etc/cas/jetty
export DNAME="${DNAME:-CN=casclient1.example.org,OU=Example,OU=Org,C=US}"
sudo keytool -genkey -alias client -keyalg RSA -keypass changeit -storepass changeit -keystore /etc/cas/jetty/thekeystore -dname ${DNAME}
sudo keytool -exportcert -alias client -storepass changeit -keystore /etc/cas/jetty/thekeystore -file /etc/cas/jetty/client.cer

第四步:匯入伺服器端證書 先將伺服器端生成的/etc/cas/cas.cer下載到本地的當前目錄,然後執行如下命令:
sudo keytool -import -trustcacerts -alias cas -keystore $JAVA_HOME/jre/lib/security/cacerts -file cas.cer  -storepass changeit
提示是否要信任該證書時,輸入”是”。 注意:經測試,官方提示匯入證書的位置不對。

如果要清除剛匯入的證書,執行如下命令:
sudo keytool -delete -alias cas -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit

第五步:執行CAS客戶端
sudo mvn clean package jetty:run-forked

部署CAS客戶端2主機 所有步驟與”部署CAS客戶端1主機”的操作一樣,把對應的casclient1.example.org替換為casclient2.example.org即可。
配置瀏覽器所在的主機 在/etc/hosts中增加如下配置: 
10.191.30.30 cas.example.org
10.191.30.31 casclient1.example.org
10.191.30.32 casclient2.example.org

測試CAS客戶端與伺服器的整合情況 第一步:先訪問CAS客戶端1: https://casclient1.example.org:9443/sample,系統會跳轉到 https://cas.example.org:8443/cas/login,然後提示登入,輸入使用者名稱casuser和密碼Mellon之後,系統回到 https://casclient1.example.org:9443/sample/頁面。登入成功。 第二步:再訪問CAS客戶端2: https://casclient2.example.org:9443/sample,這時不再需要登入。
重複上面的步驟,做另外一個客戶端CAS2。需要修改的地方包括: [1] /etc/hosts [2] cas-sample-java-webapp/src/main/webapp/WEB-INF/web.xml [3] 建立證書(貌似可以不改)
常見錯誤及解決辦法: [1] No subject alternative DNS name matching 錯誤詳情:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching cas.example.org found. 錯誤原因:原因是伺服器端建立證書的時候dname和SAN中的域名不匹配。 解決辦法:需在 cas-overlay-template的build.sh中將兩者改為一樣,舉例如下: DNAME="${DNAME:-CN=cas.example.org,OU=Example,OU=Org,C=US}” CERT_SUBJ_ALT_NAMES="${CERT_SUBJ_ALT_NAMES:-dns:cas.example.org,dns:localhost,ip:127.0.0.1}"
[2] unable to find valid certification path to requested target 錯誤詳情: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 錯誤原因:未將CAS伺服器端的證書納入到CAS客戶端的Java keystore信任庫中。 解決辦法:現將伺服器端的cas.cer下載下來,放在當前目錄,然後執行如下命令,並在提示的時候輸入”是”。如果是英文提示,需要輸入”yes”。 sudo keytool -import -trustcacerts -alias cas -keystore $JAVA_HOME/jre/lib/security/cacerts -file cas.cer  -storepass changeit
參考資料: [1]  https://apereo.github.io/cas/5.1.x/integration/CAS-Clients.html [2]  https://github.com/ditunes/blog/issues/13