ubuntu 18.04安裝CAS 5.3全記錄
注:本文初次發布于 https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=113841&page=1&authorid=70062 ,是《云享讀書會》第九期《深入淺出Spring Security》讀書筆記的一部分,因能獨立成文,特發出來給大家參考。
一、CAS概念的引出
企業在建設IT系統時,往往會不斷地擴充應用系統,以提高自身的業務能力,這些系統原先一般都有自己的登錄模塊。這就會造成系統增多之后,業務人員在操作各個系統時,極其不方便——在A系統(app1.my.com)登錄一次,再在B系統(app2.my.com)登錄一次。
這時,我們會在架構上做如下的調整:專門拉出一個系統(sso.my.com)——不做業務,只做登錄;而其他系統——只做業務,不做登錄。當后者(如app1.my.com)需要登錄時,跳轉到前面sso.my.com完成登錄,就表示后者(如app1.my.com)完成了登錄。也就是說,登錄僅僅在一個系統(sso.my.com)中完成——顧名思義,稱之為“單點登錄”(Single Sing On,即SSO)。
而用戶在瀏覽器輸入完用戶名和密碼,提供單點服務的sso.my.com服務端會在內存中生成一個用戶session(jsessionid),并在這個session中記錄“已登錄”狀態,同時,如果使用cookie的話,會在瀏覽器寫入Cookie(Set-Cookie:SessionID:xxx).這個Cookie也會成為用戶的標識。
用戶如果接著做進行業務操作,所有的請求會帶著這個Cookie,服務端就會根據這個Cookie中的sessionId找到對應的用戶Session,并根據Session的狀態判斷該用戶是否已登錄。
SSO包含同一個域下的單點登錄和不同域下的單點登錄。同一個域下的多個系統,由于Cookie不能跨域,我們可以將Cookie的域設置成my.com。這樣所有子域的系統都可以訪問my.com的Cookie。可以通過共享session(如Spring Session)的方式保證同一個用戶在不同系統的sessionid一致,但這還不是真實意義的單點登錄。
這里就引出一個CAS概念。CAS是Central Authentication Service,意思為中央驗證服務。CAS由CAS Server和CAS Client組成。CAS中有幾個概念:Ticket Granting Ticket(TGT)、Ticket Granted Cookie(TGC)和Service Ticket(ST)。其中:
(1)TGT類似于服務器Session,是用戶登錄的票根,包含用戶認證身份以及有效期等等,存放在CAS Server中。
(2)TGC類似于會話ID,是存在Cookie中的一段數據,瀏覽器在跟CAS Server交互時,TGC可以幫助找到對應的TGT。
(3)ST是CAS Server簽發的一次性票據。CAS Client使用ST跟CAS Server進行交互,獲得用戶的登錄狀態。
CAS的流程如下:
用戶訪問CAS Client的某個頁面,如app1.my.com/hello
CAS Client判斷用戶沒有登錄,會返回302狀態碼,指示瀏覽器重定向 如http://sso.my.com?service=app1.my.com/hello.在這里,service賦值為第一步的原訪問地址。
瀏覽器攜帶service重定向到CAS Server。
CAS Server獲取Cookie中的的TGC,并以此查找TGT。如果找到,則認證完成。否則,會重定向到CAS Server的登錄頁面,如http://sso.my.com/login?service=app1.my.com/hello
用戶在登錄頁面錄入用戶名,密碼,點擊登錄。首次登錄,CAS Server會生成TGT。每次驗證時,CAS Server會根據TGT簽發一個ST。將ST拼接在service中,并將TGC設置到用戶Cookie中(域為sso.my.com)。并返回302狀態碼,指示瀏覽器重定向:http://app1.my.com/hello?ticket=xxx
瀏覽器將TGC寫入的Cookie,并攜帶ticket(即ST)重定向到service即app1.my.com/hello的原業務頁面。
app1(CAS Client)拿到ticket,向CAS Server驗證ticket的有效性
如果CAS Server驗證是有效的,會告知CAS Client該ticket有效,并返回用戶信息。
app1將登錄狀態寫入session,設置app1.my.com域下的cookie。
此時,如果用戶訪問另一個系統 app2.my.com,流程如下:
用戶訪問CAS Client的某個頁面,如app2.my.com/hello
CAS Client判斷用戶沒有登錄,會返回302狀態碼,指示瀏覽器重定向 如http://sso.my.com?service=app2.my.com/hello,在這里,service賦值為第一步的原訪問地址。
瀏覽器攜帶service重定向到CAS Server。
CAS Server獲取Cookie中的的TGC,并以此查找TGT。此時因為用戶在瀏覽器登錄過,所以已經找到了。CAS Server會根據TGT簽發一個ST,將ST拼接在service中,并返回302狀態碼,指示瀏覽器重定向:http://app2.my.com/hello?ticket=xxx
瀏覽器并攜帶ticket(即ST)重定向到service即app2.my.com/hello的原業務頁面。
app2(CAS Client)拿到ticket,向CAS Server驗證ticket的有效性
如果CAS Server驗證是有效的,會告知CAS Client該ticket有效,并返回用戶信息。
app2將登錄狀態寫入session,設置app2.my.com域下的cookie。
(上圖來自 https://blog.csdn.net/A_art_xiang/article/details/107028456 )
從以上的流程可以看出,用戶在sso.my.com登錄時,業務系統并不知道這件事情。所以需要業務系統app1或app2在拿到ticket之后,到CAS Server驗證這個ST是否有效,如果有效才能被訪問。
二、CAS 5.3的搭建
CAS Server的5以前的版本,使用的是jdk11+SpringBoot2;而CAS的6版本,使用的是jdk1.8+SpringBoot1。考慮到新版本還得搞Java 11.有點復雜,張小白還是決定安裝CAS Server 5。
CAS的服務端搭建有2種方式,一個是使用源碼構建,一個是使用WAR overlay的方式安裝。CAS可以在Windows搭建,也可以在Linux搭建。這里選用了張小白熟悉的ubuntu 18.04(這個系統可以玩Atlas 200DK,也可以玩MindSpore,多玩一個系統應該也不是事兒)
1.準備軟件包
打開?https://www.apereo.org/projects/cas?網頁,
點擊Download,會進入?https://github.com/apereo/cas?頁面:
眾所周知,這個頁面很難打開。
我們需要利用?http://ipaddress.com
將github.com加入 C:\Windows\System32\drivers\etc\HOSTS 文件
再刷新DNS緩存:
再次打開github頁面:
我們可以從官網下載相關的軟件包,也可以自行準備,包含以下:
jdk1.8.0
apache-tomcat-8.5
apache-maven-3.5.3
cas-overlay-template-master
(前3個應該都能很容易下載到,最后一個如果需要需要的話,可以與我聯系)。
將相關的軟件包下載后,傳入ubuntu系統(IP:192.168.40.133),并解壓到 /home/cas/cas5.3的目錄(目的可以自行調整)
編輯/etc/profile,并source使其生效:
可檢查解壓后的java和mvn版本:
2.tomcat啟動與處理
先裸啟tomcat
瀏覽器訪問tomcat:
好像啟動沒啥問題。
下面開始制作tomcat的證書,以便使tomcat支持https訪問。
生成server.keystore
keytool -genkey -alias tomcat -keyalg RSA -keypass tomcat -storepass tomcat -keystore server.keystore -validity 3600
這里面請注意一個細節,在系統詢問“What is your first and last name?”的時候,記得這時輸入CAS服務器的域名,也就是你規劃好的SSO服務器的域名。否則,在CAS客戶端連接后會報錯。
生成證書
keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass tomcat
導入證書:
keytool -import -trustcacerts -alias tomcat -keystore "/home/cas/cas5.3/jdk1.8.0_171/jre/lib/security/cacerts" -file "/home/cas/cas5.3/apache-tomcat-8.5.31/server.cer" -storepass changeit
修改tomcat的配置文件server.xml(注意看截圖中的路徑)
找到?org.apache.coyote.http11.Http11NioProtocol http1.1的那段代碼,做如下修改:
重啟tomcat
再打開?https://192.168.40.133:8443/ 端口:(這是SSH端口,所以協議換成了https協議)
點擊“高級”,然后繼續前往即可。
也可以出現tomcat首頁。
3、安裝cas 5.3
修改pom.xml文件,將cas.version改為5.3.0:(其實也可以改為別的5版本)
做mvn install(如果編譯出了問題,可以先做mvn clean,再做mvn install)
耐心等待下載和編譯完畢:
。。
編譯成功了,在target目錄下生成了一個cas.war文件,將war包拷貝到tomcat的webapps下:
看tomcat的日志catalina.out,說明CAS已經啟動:
用瀏覽器打開?https://192.168.40.133:8443/cas/login 。
輸入CAS Sever缺省的用戶名密碼:casuser/Mellon:
點擊登錄按鈕:
可見CAS 5.3的服務器已經成功搭建。
4、讓cas 5.3使用MySQL存儲用戶名和密碼
如果要調整CAS的密碼機制為讀取數據庫,還是需要安裝MySQL,并且配置cas server的數據庫配置。
MySQL安裝
apt-get install mysql-server
mysql_secure_installation
檢查mysql狀態
如果要允許root遠程登錄(不推薦),還需要完成以下操作:
mysql -u root -p
編輯/etc/mysql/my.cnf
讓CAS增加數據庫配置:
建立dep目錄并編輯pom.xml文件:
執行?mvn -f pom.xml dependency:copy-dependencies 下載數據庫鏈接的依賴包
。。。
將編譯好的jar包拷貝到tomcat webapps下的cas/WEB-INF/lib目錄下
修改?/home/cas/cas5.3/apache-tomcat-8.5.31/webapps/cas/WEB-INF/classes/application.properties文件,在最后一段認證配置中做以下修改:
## # CAS Authentication Credentials # #cas.authn.accept.users=casuser::Mellon #配置數據庫連接 cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/casdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false #數據庫用戶名 cas.authn.jdbc.query[0].user=root #數據庫密碼 cas.authn.jdbc.query[0].password=mysql #mysql驅動 cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver #添加jdbc認證 cas.authn.jdbc.query[0].sql=SELECT * FROM login WHERE login_name =? #哪個字段作為密碼字段 cas.authn.jdbc.query[0].fieldPassword=login_password #哪個字段作為過期字段 0:未過期 1:已過期 cas.authn.jdbc.query[0].fieldExpired=expired #哪個字段作為是否可用字段 0:未禁用 1:已禁用 cas.authn.jdbc.query[0].fieldDisabled=disabled #配置加密策略 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
請注意mysql連接串如果不加
serverTimezone=UTC
可能會報錯。
在mysql建個casdb數據庫
create database casdb;
并建立ogin表:
插入2條數據:
重啟tomcat
再重新打開頁面: https://192.168.40.133:8443/cas/login
輸入:test? ?密碼:123456? ?(普通md5)可以正常登錄。
從后臺日志也可以看出:CAS驗證成功并發了ticket。
用戶密碼的密文生成:
大家肯定有疑問,login表中login_password密碼字段的那串密文是怎么得來的呢?張小白介紹一下:
建一個Maven工程,用來生成加密鹽的密碼:
把計算出的結果更新mysql數據庫的login表:
再在/home/cas/cas5.3/apache-tomcat-8.5.31/webapps/cas/WEB-INF/classes/application.properties 中增加第二種認證策略,策略中的Salt、加密算法等保證跟前面計算密碼密文的一致。
#數據庫連接 cas.authn.jdbc.encode[0].driverClass=com.mysql.cj.jdbc.Driver cas.authn.jdbc.encode[0].url=jdbc:mysql://127.0.0.1:3306/casdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false cas.authn.jdbc.encode[0].user=root cas.authn.jdbc.encode[0].password=mysql #加密迭代次數 cas.authn.jdbc.encode[0].numberOfIterations=2 #該列名的值可替代上面的值,但對密碼加密時必須取該值進行處理 cas.authn.jdbc.encode[0].numberOfIterationsFieldName= #動態鹽值用的字段 cas.authn.jdbc.encode[0].saltFieldName=login_name #靜態鹽值 cas.authn.jdbc.encode[0].staticSalt=654321 cas.authn.jdbc.encode[0].sql=SELECT * FROM login WHERE login_name =? #對處理鹽值后的算法 cas.authn.jdbc.encode[0].algorithmName=MD5 #哪個字段作為密碼字段 cas.authn.jdbc.encode[0].passwordFieldName=login_password #哪個字段作為過期字段 0:未過期 1:已過期 cas.authn.jdbc.encode[0].expiredFieldName=expired #哪個字段作為是否可用字段 0:未禁用 1:已禁用 cas.authn.jdbc.encode[0].disabledFieldName=disabled
再重啟tomcat
打開頁面https://192.168.40.133:8443/cas/login?,
輸入 用戶名admin ,密碼123456登錄
終于也可以成功登錄了。
看一下后臺日志catalina.out,確實是admin用戶成功登陸了。
從上面可以看出,盡管2個用戶的密碼都是123456,但是一個是簡單的MD5加密,一個是加了鹽的MD5加密,所以密文是不一樣的。
當然,如果在瀏覽器輸入:https://192.168.40.133:8443/cas/logout
可以把登錄的用戶注銷。
后臺日志也顯示這個ticket被銷毀了:
至此,CAS Server總算搭建完成了。
當然,CAS Server需要CAS Client的配合才能完整使用。這點張小白還在嘗試之中。本文暫時不談CAS Client的問題。有興趣的人可以看下張小白讀書筆記的最后一段內容研究下。
參考資料:
1.單點登錄(SSO)看這一篇就夠了?https://www.jianshu.com/p/75edcc05acfd
2.關于JSESSIONID?https://www.jianshu.com/p/f2e5db637ed4
3.Spring Security基于JWT實現SSO單點登錄?https://blog.csdn.net/qq_36144258/article/details/79425942
4.CAS-搭建CAS Server服務端(靜態認證)??https://my.oschina.net/u/4335103/blog/4535512
5. CAS server6.x配置與部署筆記?https://blog.csdn.net/hy9418/article/details/107104177/
6. CAS單點登錄學習筆記--CAS Server搭建(一)https://blog.csdn.net/polo_longsan/article/details/91391272
7. 輕松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER 服務端?https://blog.csdn.net/weixin_39206782/article/details/80659033
8. CAS5.3單點登錄(一)服務器搭建?https://blog.csdn.net/zzy730913/article/details/80796716
9. CentOS安裝CAS 5.3.4服務端?https://www.cnblogs.com/kgdxpr/p/9854657.html
10.?終于把單點登錄完整流程圖畫明白了!史上最完整的CAS單點登錄完整圖解!https://blog.csdn.net/A_art_xiang/article/details/107028456
(全文完,謝謝閱讀)
https Spring Boot Tomcat Ubuntu 軟件安全
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。