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
語(yǔ)言參數(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窗口生成證書,命令如下: --生成證書庫(kù)
keytool -genkey -alias 800jit -keyalg RSA -keystore d:/cert/800jitkey
--從證書庫(kù)中到處證書
keytool -export -file d:/cert/800jit.crt -alias 800jit -keystore d:/cert/800jitkey --把證書導(dǎo)入jdk 的證書庫(kù)
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 原理介紹 訪問(wèn)流程圖 主要原理:用戶第一次訪問(wèn)一個(gè)CAS 服務(wù)的客戶web 應(yīng)用時(shí)(訪問(wèn)URL :http://192.168.1.90:8081/web1 ),部署在客戶web 應(yīng)用的cas AuthenticationFilter ,會(huì)截獲此請(qǐng)求,生成service 參數(shù),然后redirect 到CAS 服務(wù)的login 接口,url 為https://cas:8443/cas/login?service=http://192.168.1.90:8081/web1/ ,認(rèn)證成功后,CAS 服務(wù)器會(huì)生成認(rèn)證cookie ,寫入瀏覽器,同時(shí)將cookie 緩存到服務(wù)器本地,CAS 服務(wù)器還會(huì)根據(jù)service 參數(shù)生成ticket,ticket 會(huì)保存到服務(wù)器,也會(huì)加在url 后面,然后將請(qǐng)求redirect 回客戶web 應(yīng)用,url 為http://192.168.1.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。這時(shí)客戶端的AuthenticationFilter 看到ticket 參數(shù)后,會(huì)跳過(guò),由其后面的TicketValidationFilter 處理,TicketValidationFilter 會(huì)利用httpclient 工具訪問(wèn)cas 服務(wù)的/serviceValidate 接口, 將ticket 、service 都傳到此接口,由此接口驗(yàn)證ticket 的有效性,TicketValidationFilter 如果得到驗(yàn)證成功的消息,就會(huì)把用戶信息寫入web 應(yīng)用的session 里。至此為止,SSO 會(huì)話就建立起來(lái)了,以后用戶在同一瀏覽器里訪問(wèn)此web 應(yīng)用時(shí),AuthenticationFilter 會(huì)在session 里讀取到用戶信息,所以就不會(huì)去CAS 認(rèn)證,如果在此瀏覽器里訪問(wèn)別的web 應(yīng)用時(shí),AuthenticationFilter 在session 里讀取不到用戶信息,會(huì)去CAS 的login 接口認(rèn)證,但這時(shí)CAS 會(huì)讀取到瀏覽器傳來(lái)的cookie ,所以CAS 不會(huì)要求用戶去登錄頁(yè)面登錄,只是會(huì)根據(jù)service 參數(shù)生成一個(gè)ticket ,然后再和web 應(yīng)用做一個(gè)驗(yàn)證ticket 的交互。 二、CAS 服務(wù)端的處理邏輯 CAS 服務(wù)端總共對(duì)外定義了9 個(gè)接口,客戶端通過(guò)訪問(wèn)這9 個(gè)接口與服務(wù)端交互,這9個(gè)接口為: 接口 /login /logout /validate 說(shuō)明 認(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ì)說(shuō)明: /login: 登錄流程這部分要考慮到不同種類用戶憑證的獲取方案,以及客戶應(yīng)用傳來(lái)的service 、gateway 、renew 參數(shù)的不同取值組合,CAS 為了實(shí)現(xiàn)流程的高度可配置性,采用了Spring Web Flow 技術(shù)。通過(guò)CAS 發(fā)布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 這3 個(gè)文件,找出 了登錄有關(guān)的所有組件,畫出處理流程圖。 CAS 默認(rèn)的登錄處理流程 第一次訪問(wèn)Web 應(yīng)用的流程走向 已經(jīng)登錄web1 后,訪問(wèn)web1 的資源(web1 沒(méi)有啟動(dòng)session ),或訪問(wèn)web2 的資源 注: 1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值來(lái)設(shè)置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定義的,但這個(gè) 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 對(duì)象, 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 這是登錄頁(yè)面, CAS 在此收集用戶憑證。 CAS 提供的默認(rèn)實(shí)現(xiàn)是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。 4 : bindAndValidate 對(duì)應(yīng) AuthenticationViaFormAction 的 doBind 方法,該方法負(fù)責(zé)搜集登錄頁(yè)面上用戶錄入的憑證信息(用戶名、密碼等),然后把這些信息封裝到 CAS 內(nèi)部的 Credentials 對(duì)象中。用戶在 casLoginView.jsp 頁(yè)面上點(diǎn)擊提交后,會(huì)觸發(fā)此方法。 5:submit 對(duì)應(yīng) AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功執(zhí)行完, 則觸發(fā) submit 方法,此方法負(fù)責(zé)調(diào)用centralAuthenticationService 的 grantServiceTicket 方法,完成認(rèn)證工作,如果認(rèn)證成功,則生成 TicketGrantingTicket 對(duì)象,放在緩存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。 6 : warn CAS 提供了一個(gè)功能:用戶在一個(gè) web 應(yīng)用中跳到另一個(gè) web 應(yīng)用時(shí), CAS 可以跳轉(zhuǎn)到一個(gè)提示頁(yè)面,該頁(yè)面提示用戶要離開一個(gè)應(yīng)用進(jìn)入另一個(gè)應(yīng)用,可以讓用戶自己選擇。用戶在登錄頁(yè)面 viewLoginForm 上選中了 id=”warn ” 的復(fù)選框,才能開啟這個(gè)功能。 WarnAction 就檢查用戶有沒(méi)有開啟這個(gè)功能,如果開啟了,則轉(zhuǎn)發(fā)到showWarnView, 如果沒(méi)開啟,則直接redirect 到客戶應(yīng)用。 7 :SendTicketGrantingTicketAction 此Action 負(fù)責(zé)為response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 對(duì)象的 ID 。 8 : viewGenerateLoginSuccess 這是 CAS 的認(rèn)證成功頁(yè)面。 /logout: ( 對(duì)應(yīng)實(shí)現(xiàn)類 org.jasig.cas.web.LogoutController ) 處理邏輯: 1) removeCookie 2) 在服務(wù)端刪除TicketGrantingTicket 對(duì)象(此對(duì)象封裝了cookie 的value 值) 3 )redirect 到退出頁(yè)面,有2 種選擇: if(LogoutController 的followServiceRedirects 屬性為true 值,且url 里的service 參數(shù)非空){ redirect 到 sevice 參數(shù)標(biāo)識(shí)的url } else{ redirect 到內(nèi)置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 參數(shù),則此url 參數(shù)標(biāo)識(shí)的鏈接會(huì)顯示在casLogoutView 頁(yè)面上。 } /serviceValidate: (對(duì)應(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 對(duì)象,如果能找到,且沒(méi)有過(guò)期,且ServiceTicketImpl 對(duì)象對(duì)應(yīng)的service 屬性和service 參數(shù)對(duì)應(yīng),則驗(yàn)證通過(guò),驗(yàn)證通過(guò)后,請(qǐng)求轉(zhuǎn)發(fā)至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),驗(yàn)證不通過(guò),則轉(zhuǎn)發(fā)到failureView 。 三、認(rèn)證相關(guān)的概念及流程 概念 ? Credentials 用戶提供的用于登錄用的憑據(jù)信息,如用戶名/ 密碼、證書、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封裝的是用戶名和密碼。CAS 進(jìn)行認(rèn)證的第一步,就是把從UI 或request 對(duì)象里取到的用戶憑據(jù)封裝成Credentials 對(duì)象,然后交給認(rèn)證管理器去認(rèn)證。 ? AuthenticationHandler 認(rèn)證Handler , 每種AuthenticationHandler 只能處理一種Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只負(fù)責(zé)處理 U sernamePasswordCredentials 。 ? ? Principal 封裝用戶標(biāo)識(shí),比如 SimplePrincipal, 只是封裝了用戶名。認(rèn)證成功后, CredentialsToPrincipalResolvers 負(fù)責(zé)由 Credentials 生成 Principal 對(duì)象,每種 只處理 一種 負(fù)Credentials 責(zé)從, 比如 U credentialsToPrincipalResolvers 負(fù)責(zé)由Credentials 生成 Principal 對(duì)象。 CredentialsT oPrincipalResolvers UsernamePasswordCredentialsToPrincipalResolver 性。 ? ? ? ? sernamePasswordCredentials 中取出用戶名,然后將其賦給生成的 SimplePrincipal 的 ID 屬AuthenticationMetaDataPopulators 負(fù)責(zé)將 Credentials 的一些屬性賦值給 Authentication Authentication 是認(rèn)證管理器的最終處理結(jié)果, Authentication 封裝了 AuthenticationManager 認(rèn)證管理器得到 Credentials 對(duì)象后,負(fù)責(zé)調(diào)度CentralAuthenticationService CAS 的服務(wù)類,對(duì) Web 層提供了一些方法。該類還負(fù)Authentication 的 attributes 屬性。 Principal ,認(rèn)證時(shí)間,及其他一些屬性(可能來(lái)自 Credentials )。 AuthenticationHandler 去完成認(rèn)證工作,最后返回的結(jié)果是 Authentication 對(duì)象。 責(zé)調(diào)用 AuthenticationManager 完成認(rèn)證邏輯。 序列圖


