javaSSL
cas 改造隨筆Sso doc關鍵字:sso 域名:cas.server .com登陸地址(spring web flow):https://cas.server.com/cas/login 登陸地址
cas 改造隨筆
Sso doc
關鍵字:
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 :證書導出工具http://www.myssl.cn/download/jks2pfx.zip memcache :memcached-1.2.1-win32(需要memcache 集群環(huán)境)
二、安全證書生成
,1、keytool
Apache 、tomcat 、jdk 需要使用安全證書,進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 --把證書導入jdk 的證書庫
keytool -import -keystore d: /jdk1.6.0_13/jre/lib/security/cacerts -file d:/cert/800jit.crt -alias 800jit
--生成Apache 服務器的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 虛擬機
--修改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 服務的客戶web 應用時(訪問URL :http://192.168.1.90:8081/web1 ),部署在客戶web 應用的cas AuthenticationFilter ,會截獲此請求,生成service 參數(shù),然后redirect 到CAS 服務的login 接口,url 為https://cas:8443/cas/login?service=http://192.168.1.90:8081/web1/ ,認證成功后,CAS 服務器會生成認證cookie ,寫入瀏覽器,同時將cookie 緩存到服務器本地,CAS 服務器還會根據(jù)service 參數(shù)生成ticket,ticket 會保存到服務器,也會加在url 后面,然后將請求redirect 回客戶web 應用,url 為http://192.168.1.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。這時客戶端的AuthenticationFilter 看到ticket 參數(shù)后,會跳過,由其后面的TicketValidationFilter 處理,TicketValidationFilter 會利用httpclient 工具訪問cas 服務的/serviceValidate 接口, 將ticket 、service 都傳到此接口,由此接口驗證ticket 的有效性,TicketValidationFilter 如果得到驗證成功的消息,就會把用戶信息寫入web 應用的session 里。至此為止,SSO 會話就建立起來了,以后用戶在同一瀏覽器里訪問此web 應用時,AuthenticationFilter 會在session 里讀取到用戶信息,所以就不會去CAS 認證,如果在此瀏覽器里訪問別的web 應用時,AuthenticationFilter 在session 里讀取不到用戶信息,會去CAS 的login 接口認證,但這時CAS 會讀取到瀏覽器傳來的cookie ,所以CAS 不會要求用戶去登錄頁面登錄,只是會根據(jù)service 參數(shù)生成一個ticket ,然后再和web 應用做一個驗證ticket 的交互。 二、CAS 服務端的處理邏輯 CAS 服務端總共對外定義了9 個接口,客戶端通過訪問這9 個接口與服務端交互,這9個接口為: 接口 /login /logout /validate 說明 認證接口 備注 退出接口,負責銷毀認證cookie 驗證ticket 用的接口,CAS1.0 定 義 /serviceValidate 驗證ticket 用的接口,CAS2.0 定 義,返回xml 格式的數(shù)據(jù) /proxy /proxyValidate 支持代理認證功能的接口 支持代理認證功能的接口 /CentralAuthenticationService 用于和遠程的web services 交互 /remoteLogin(新增) /directLogin(新增) 認證接口 認證接口 詳細說明: /login: 登錄流程這部分要考慮到不同種類用戶憑證的獲取方案,以及客戶應用傳來的service 、gateway 、renew 參數(shù)的不同取值組合,CAS 為了實現(xiàn)流程的高度可配置性,采用了Spring Web Flow 技術。通過CAS 發(fā)布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 這3 個文件,找出 了登錄有關的所有組件,畫出處理流程圖。 CAS 默認的登錄處理流程 第一次訪問Web 應用的流程走向 已經(jīng)登錄web1 后,訪問web1 的資源(web1 沒有啟動session ),或訪問web2 的資源 注: 1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值來設置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定義的,但這個 Action 負責將 request.getContextPath() 的值設置為 Cookie 的 path 值,這是在 cas 部署環(huán)境改變的情況下,靈活地設置 cookie path 的方式;把 cookie 的值以及 service 參數(shù)的值放入 requestContext 的 flowscope 里。 2 : GenerateServiceTicketAction 此 Action 負責根據(jù) service 、 GTC cookie 值生成 ServiceTicket 對象, ServiceTicket 的 ID 就是返回給客戶應用的 ticket 參數(shù),如果成功創(chuàng)建 ServiceTicket ,則轉發(fā)到 WarnAction ,如果創(chuàng)建失敗,且 gateway 參數(shù)為 true ,則直接redirect 到客戶應用, 否則則需要重新認證。 3 : viewLoginForm 這是登錄頁面, CAS 在此收集用戶憑證。 CAS 提供的默認實現(xiàn)是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。 4 : bindAndValidate 對應 AuthenticationViaFormAction 的 doBind 方法,該方法負責搜集登錄頁面上用戶錄入的憑證信息(用戶名、密碼等),然后把這些信息封裝到 CAS 內部的 Credentials 對象中。用戶在 casLoginView.jsp 頁面上點擊提交后,會觸發(fā)此方法。 5:submit 對應 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功執(zhí)行完, 則觸發(fā) submit 方法,此方法負責調用centralAuthenticationService 的 grantServiceTicket 方法,完成認證工作,如果認證成功,則生成 TicketGrantingTicket 對象,放在緩存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。 6 : warn CAS 提供了一個功能:用戶在一個 web 應用中跳到另一個 web 應用時, CAS 可以跳轉到一個提示頁面,該頁面提示用戶要離開一個應用進入另一個應用,可以讓用戶自己選擇。用戶在登錄頁面 viewLoginForm 上選中了 id=”warn ” 的復選框,才能開啟這個功能。 WarnAction 就檢查用戶有沒有開啟這個功能,如果開啟了,則轉發(fā)到showWarnView, 如果沒開啟,則直接redirect 到客戶應用。 7 :SendTicketGrantingTicketAction 此Action 負責為response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 對象的 ID 。 8 : viewGenerateLoginSuccess 這是 CAS 的認證成功頁面。 /logout: ( 對應實現(xiàn)類 org.jasig.cas.web.LogoutController ) 處理邏輯: 1) removeCookie 2) 在服務端刪除TicketGrantingTicket 對象(此對象封裝了cookie 的value 值) 3 )redirect 到退出頁面,有2 種選擇: if(LogoutController 的followServiceRedirects 屬性為true 值,且url 里的service 參數(shù)非空){ redirect 到 sevice 參數(shù)標識的url } else{ redirect 到內置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 參數(shù),則此url 參數(shù)標識的鏈接會顯示在casLogoutView 頁面上。 } /serviceValidate: (對應實現(xiàn)類 org.jasig.cas.web.ServiceValidateController ) 處理邏輯: 如果service 參數(shù)為空或ticket 參數(shù)為空,則轉發(fā)到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp ) 驗證ticket 。以ticket 為參數(shù),去緩存里找ServiceTicketImpl 對象,如果能找到,且沒有過期,且ServiceTicketImpl 對象對應的service 屬性和service 參數(shù)對應,則驗證通過,驗證通過后,請求轉發(fā)至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),驗證不通過,則轉發(fā)到failureView 。 三、認證相關的概念及流程 概念 ? Credentials 用戶提供的用于登錄用的憑據(jù)信息,如用戶名/ 密碼、證書、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封裝的是用戶名和密碼。CAS 進行認證的第一步,就是把從UI 或request 對象里取到的用戶憑據(jù)封裝成Credentials 對象,然后交給認證管理器去認證。 ? AuthenticationHandler 認證Handler , 每種AuthenticationHandler 只能處理一種Credentials ,如AbstractUsernamePasswordAuthenticationHandler 只負責處理 U sernamePasswordCredentials 。 ? ? Principal 封裝用戶標識,比如 SimplePrincipal, 只是封裝了用戶名。認證成功后, CredentialsToPrincipalResolvers 負責由 Credentials 生成 Principal 對象,每種 只處理 一種 負Credentials 責從, 比如 U credentialsToPrincipalResolvers 負責由Credentials 生成 Principal 對象。 CredentialsT oPrincipalResolvers UsernamePasswordCredentialsToPrincipalResolver 性。 ? ? ? ? sernamePasswordCredentials 中取出用戶名,然后將其賦給生成的 SimplePrincipal 的 ID 屬AuthenticationMetaDataPopulators 負責將 Credentials 的一些屬性賦值給 Authentication Authentication 是認證管理器的最終處理結果, Authentication 封裝了 AuthenticationManager 認證管理器得到 Credentials 對象后,負責調度CentralAuthenticationService CAS 的服務類,對 Web 層提供了一些方法。該類還負Authentication 的 attributes 屬性。 Principal ,認證時間,及其他一些屬性(可能來自 Credentials )。 AuthenticationHandler 去完成認證工作,最后返回的結果是 Authentication 對象。 責調用 AuthenticationManager 完成認證邏輯。 序列圖