javaSSL
cas 改造隨筆Sso doc關(guān)鍵字:sso 域名:cas.server .com登陸地址(spring web flow):https://cas.server.com/cas/login 登陸地址
cas 改造隨筆
Sso doc
關(guān)鍵字:
sso 域名:cas.server .com
登陸地址(spring web flow):https://cas.server.com/cas/login 登陸地址(直接):https://cas.server.com/cas/directLogin 退出地址:https://cas.server.com/cas/logout
語言參數(shù):locale=zh_CN,locale=en
環(huán)境篇
一、所需軟件
Jdk :jdk1.6.0_13
Apache :httpd-2.2.15-win32-x86-openssl-0.9.8m-r2
Tomcat :apache-tomcat-6.0.10
jks2pfx :證書導(dǎo)出工具h(yuǎn)ttp://www.myssl.cn/download/jks2pfx.zip memcache :memcached-1.2.1-win32(需要memcache 集群環(huán)境)
二、安全證書生成
,1、keytool
Apache 、tomcat 、jdk 需要使用安全證書,進(jìn)windows command窗口生成證書,命令如下: --生成證書庫
keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey
--從證書庫中到處證書
keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey --把證書導(dǎo)入jdk 的證書庫
keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit
--生成Apache 服務(wù)器的SSL 連接需要配置私鑰文件和證書文件
D:?sexjks2pfx>JKS2PFX.bat .keystore 800jitkey tomcat server_dev00
生成的server_dev00.crt,server_dev00.key放到D:/work/Apache2.2/conf/
2、openssl
openssl req -config ..confopenssl.cnf -new -out olymtech.csr
openssl rsa -in privkey.pem -out olymtech.key
openssl x509 -in olymtech.csr -out olymtech.cert -req -signkey olymtech.key -days 3650
openssl x509 -in olymtech.cert -out olymtech.der.crt -outform DER
keytool -import -keystore d:/work/jdk1.6.0_13/jre/lib/security/cacerts -file d:/casex/ssl/olymtech.crt -alias olymtech
keytool -import -keystore D:/casex/800jitkey -file D:/casex/cas-doc/ssl/olymtech.crt -alias olymtech
三、Apache 配置
Apache ssl 虛擬機(jī)
--修改http.conf 文件
取消注釋 LoadModule ssl_module modules/mod_ssl.so
取消注釋 Include conf/extra/httpd-ssl.conf
取消注釋 Include conf/extra/httpd-vhosts.conf
ProxyPass /cas balancer://cas lbmethod=bytraffic stickysession=jsessionid
BalancerMember ajp://192.168.1.190:10009/cas loadfactor=1 route=jvm1 BalancerMember ajp://192.168.1.190:8009/cas loadfactor=1 route=jvm2
,--修改httpd-ssl.conf
在
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid ProxyPassReverse /cas balancer://cas/
SSLProxyEngine On
修改
SSLCertificateFile "D:/work/Apache2.2/conf/server_dev00.crt"
SSLCertificateKeyFile "D:/work/Apache2.2/conf/server_dev00.key"
--修改httpd-vhosts.conf
在
ProxyPass /cas balancer://cas/ lbmethod=bytraffic stickysession=jsessionid ProxyPassReverse /cas balancer://cas/
四、Tomcat 配置
修改server .xml
--配置ssl
maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/work/apache-tomcat-6.0.10/conf/800jitkey" keystorePass="111111" /> 五、session 共享(Tomcat ) 六、memcache 集群 CAS SERVER篇 一、CAS 原理介紹 訪問流程圖 主要原理:用戶第一次訪問一個CAS 服務(wù)的客戶web 應(yīng)用時(訪問URL :http://192.168.1.90:8081/web1 ),部署在客戶web 應(yīng)用的cas AuthenticationFilter ,會截獲此請求,生成service 參數(shù),然后redirect 到CAS 服務(wù)的login 接口,url 為https://cas:8443/cas/login?service=http://192.168.1.90:8081/web1/ ,認(rèn)證成功后,CAS 服務(wù)器會生成認(rèn)證cookie ,寫入瀏覽器,同時將cookie 緩存到服務(wù)器本地,CAS 服務(wù)器還會根據(jù)service 參數(shù)生成ticket,ticket 會保存到服務(wù)器,也會加在url 后面,然后將請求redirect 回客戶web 應(yīng)用,url 為http://192.168.1.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。這時客戶端的AuthenticationFilter 看到ticket 參數(shù)后,會跳過,由其后面的TicketValidationFilter 處理,TicketValidationFilter 會利用httpclient 工具訪問cas 服務(wù)的/serviceValidate 接口, 將ticket 、service 都傳到此接口,由此接口驗(yàn)證ticket 的有效性,TicketValidationFilter 如果得到驗(yàn)證成功的消息,就會把用戶信息寫入web 應(yīng)用的session 里。至此為止,SSO 會話就建立起來了,以后用戶在同一瀏覽器里訪問此web 應(yīng)用時,AuthenticationFilter 會在session 里讀取到用戶信息,所以就不會去CAS 認(rèn)證,如果在此瀏覽器里訪問別的web 應(yīng)用時,AuthenticationFilter 在session 里讀取不到用戶信息,會去CAS 的login 接口認(rèn)證,但這時CAS 會讀取到瀏覽器傳來的cookie ,所以CAS 不會要求用戶去登錄頁面登錄,只是會根據(jù)service 參數(shù)生成一個ticket ,然后再和web 應(yīng)用做一個驗(yàn)證ticket 的交互。 二、CAS 服務(wù)端的處理邏輯 CAS 服務(wù)端總共對外定義了9 個接口,客戶端通過訪問這9 個接口與服務(wù)端交互,這9個接口為: 接口 /login /logout /validate 說明 認(rèn)證接口 備注 退出接口,負(fù)責(zé)銷毀認(rèn)證cookie 驗(yàn)證ticket 用的接口,CAS1.0 定 義 /serviceValidate 驗(yàn)證ticket 用的接口,CAS2.0 定 義,返回xml 格式的數(shù)據(jù) /proxy /proxyValidate 支持代理認(rèn)證功能的接口 支持代理認(rèn)證功能的接口 /CentralAuthenticationService 用于和遠(yuǎn)程的web services 交互 /remoteLogin(新增) /directLogin(新增) 認(rèn)證接口 認(rèn)證接口 詳細(xì)說明: /login: 登錄流程這部分要考慮到不同種類用戶憑證的獲取方案,以及客戶應(yīng)用傳來的service 、gateway 、renew 參數(shù)的不同取值組合,CAS 為了實(shí)現(xiàn)流程的高度可配置性,采用了Spring Web Flow 技術(shù)。通過CAS 發(fā)布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 這3 個文件,找出 了登錄有關(guān)的所有組件,畫出處理流程圖。 CAS 默認(rèn)的登錄處理流程 第一次訪問Web 應(yīng)用的流程走向 已經(jīng)登錄web1 后,訪問web1 的資源(web1 沒有啟動session ),或訪問web2 的資源 注: 1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值來設(shè)置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定義的,但這個 Action 負(fù)責(zé)將 request.getContextPath() 的值設(shè)置為 Cookie 的 path 值,這是在 cas 部署環(huán)境改變的情況下,靈活地設(shè)置 cookie path 的方式;把 cookie 的值以及 service 參數(shù)的值放入 requestContext 的 flowscope 里。 2 : GenerateServiceTicketAction 此 Action 負(fù)責(zé)根據(jù) service 、 GTC cookie 值生成 ServiceTicket 對象, ServiceTicket 的 ID 就是返回給客戶應(yīng)用的 ticket 參數(shù),如果成功創(chuàng)建 ServiceTicket ,則轉(zhuǎn)發(fā)到 WarnAction ,如果創(chuàng)建失敗,且 gateway 參數(shù)為 true ,則直接redirect 到客戶應(yīng)用, 否則則需要重新認(rèn)證。 3 : viewLoginForm 這是登錄頁面, CAS 在此收集用戶憑證。 CAS 提供的默認(rèn)實(shí)現(xiàn)是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。 4 : bindAndValidate 對應(yīng) AuthenticationViaFormAction 的 doBind 方法,該方法負(fù)責(zé)搜集登錄頁面上用戶錄入的憑證信息(用戶名、密碼等),然后把這些信息封裝到 CAS 內(nèi)部的 Credentials 對象中。用戶在 casLoginView.jsp 頁面上點(diǎn)擊提交后,會觸發(fā)此方法。 5:submit 對應(yīng) AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功執(zhí)行完, 則觸發(fā) submit 方法,此方法負(fù)責(zé)調(diào)用centralAuthenticationService 的 grantServiceTicket 方法,完成認(rèn)證工作,如果認(rèn)證成功,則生成 TicketGrantingTicket 對象,放在緩存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。 6 : warn CAS 提供了一個功能:用戶在一個 web 應(yīng)用中跳到另一個 web 應(yīng)用時, CAS 可以跳轉(zhuǎn)到一個提示頁面,該頁面提示用戶要離開一個應(yīng)用進(jìn)入另一個應(yīng)用,可以讓用戶自己選擇。用戶在登錄頁面 viewLoginForm 上選中了 id=”warn ” 的復(fù)選框,才能開啟這個功能。 WarnAction 就檢查用戶有沒有開啟這個功能,如果開啟了,則轉(zhuǎn)發(fā)到showWarnView, 如果沒開啟,則直接redirect 到客戶應(yīng)用。 7 :SendTicketGrantingTicketAction 此Action 負(fù)責(zé)為response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 對象的 ID 。 8 : viewGenerateLoginSuccess 這是 CAS 的認(rèn)證成功頁面。 /logout: ( 對應(yīng)實(shí)現(xiàn)類 org.jasig.cas.web.LogoutController ) 處理邏輯: 1) removeCookie 2) 在服務(wù)端刪除TicketGrantingTicket 對象(此對象封裝了cookie 的value 值) 3 )redirect 到退出頁面,有2 種選擇: if(LogoutController 的followServiceRedirects 屬性為true 值,且url 里的service 參數(shù)非空){ redirect 到 sevice 參數(shù)標(biāo)識的url } else{ redirect 到內(nèi)置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 參數(shù),則此url 參數(shù)標(biāo)識的鏈接會顯示在casLogoutView 頁面上。 } /serviceValidate: (對應(yīng)實(shí)現(xiàn)類 org.jasig.cas.web.ServiceValidateController ) 處理邏輯: 如果service 參數(shù)為空或ticket 參數(shù)為空,則轉(zhuǎn)發(fā)到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp ) 驗(yàn)證ticket 。以ticket 為參數(shù),去緩存里找ServiceTicketImpl 對象,如果能找到,且沒有過期,且ServiceTicketImpl 對象對應(yīng)的service 屬性和service 參數(shù)對應(yīng),則驗(yàn)證通過,驗(yàn)證通過后,請求轉(zhuǎn)發(fā)至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),驗(yàn)證不通過,則轉(zhuǎn)發(fā)到failureView 。 三、認(rèn)證相關(guān)的概念及流程 概念 ? Credentials 用戶提供的用于登錄用的憑據(jù)信息,如用戶名/ 密碼、證書、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封裝的是用戶名和密碼。CAS 進(jìn)行認(rèn)證的第一步,就是把從UI 或request 對象里取到的用戶憑據(jù)封裝成Credentials 對象,然后交給認(rèn)證管理器去認(rèn)證。 ? AuthenticationHandler 認(rèn)證Handler , 每種AuthenticationHandler 只能處理一種Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只負(fù)責(zé)處理 U sernamePasswordCredentials 。 ? ? Principal 封裝用戶標(biāo)識,比如 SimplePrincipal, 只是封裝了用戶名。認(rèn)證成功后, CredentialsToPrincipalResolvers 負(fù)責(zé)由 Credentials 生成 Principal 對象,每種 只處理 一種 負(fù)Credentials 責(zé)從, 比如 U credentialsToPrincipalResolvers 負(fù)責(zé)由Credentials 生成 Principal 對象。 CredentialsT oPrincipalResolvers UsernamePasswordCredentialsToPrincipalResolver 性。 ? ? ? ? sernamePasswordCredentials 中取出用戶名,然后將其賦給生成的 SimplePrincipal 的 ID 屬AuthenticationMetaDataPopulators 負(fù)責(zé)將 Credentials 的一些屬性賦值給 Authentication Authentication 是認(rèn)證管理器的最終處理結(jié)果, Authentication 封裝了 AuthenticationManager 認(rèn)證管理器得到 Credentials 對象后,負(fù)責(zé)調(diào)度CentralAuthenticationService CAS 的服務(wù)類,對 Web 層提供了一些方法。該類還負(fù)Authentication 的 attributes 屬性。 Principal ,認(rèn)證時間,及其他一些屬性(可能來自 Credentials )。 AuthenticationHandler 去完成認(rèn)證工作,最后返回的結(jié)果是 Authentication 對象。 責(zé)調(diào)用 AuthenticationManager 完成認(rèn)證邏輯。 序列圖