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
语言参数:locale=zh_CN,locale=en
环境篇
一、所需软件
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 集群环境)
二、安全证书生成
,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 参数,然后redirect 到CAS 服务的login 接口,url 为https://cas:8443/cas/login?service=http://192.168.1.90:8081/web1/ ,认证成功后,CAS 服务器会生成认证cookie ,写入浏览器,同时将cookie 缓存到服务器本地,CAS 服务器还会根据service 参数生成ticket,ticket 会保存到服务器,也会加在url 后面,然后将请求redirect 回客户web 应用,url 为http://192.168.1.90:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZuMwnbMvxpCBcNAIi6-20 。这时客户端的AuthenticationFilter 看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理,TicketValidationFilter 会利用httpclient 工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,TicketValidationFilter 如果得到验证成功的消息,就会把用户信息写入web 应用的session 里。至此为止,SSO 会话就建立起来了,以后用户在同一浏览器里访问此web 应用时,AuthenticationFilter 会在session 里读取到用户信息,所以就不会去CAS 认证,如果在此浏览器里访问别的web 应用时,AuthenticationFilter 在session 里读取不到用户信息,会去CAS 的login 接口认证,但这时CAS 会读取到浏览器传来的cookie ,所以CAS 不会要求用户去登录页面登录,只是会根据service 参数生成一个ticket ,然后再和web 应用做一个验证ticket 的交互。 二、CAS 服务端的处理逻辑 CAS 服务端总共对外定义了9 个接口,客户端通过访问这9 个接口与服务端交互,这9个接口为: 接口 /login /logout /validate 说明 认证接口 备注 退出接口,负责销毁认证cookie 验证ticket 用的接口,CAS1.0 定 义 /serviceValidate 验证ticket 用的接口,CAS2.0 定 义,返回xml 格式的数据 /proxy /proxyValidate 支持代理认证功能的接口 支持代理认证功能的接口 /CentralAuthenticationService 用于和远程的web services 交互 /remoteLogin(新增) /directLogin(新增) 认证接口 认证接口 详细说明: /login: 登录流程这部分要考虑到不同种类用户凭证的获取方案,以及客户应用传来的service 、gateway 、renew 参数的不同取值组合,CAS 为了实现流程的高度可配置性,采用了Spring Web Flow 技术。通过CAS 发布包里的login-webflow.xml 、cas-servlet.xml 、applicationContext.xml 这3 个文件,找出 了登录有关的所有组件,画出处理流程图。 CAS 默认的登录处理流程 第一次访问Web 应用的流程走向 已经登录web1 后,访问web1 的资源(web1 没有启动session ),或访问web2 的资源 注: 1 : InitialFlowSetupAction: 是流程的入口。用 request.getContextPath() 的值来设置 cookie 的 Path 值, Cookie 的 path 值是在配置文件里定义的,但这个 Action 负责将 request.getContextPath() 的值设置为 Cookie 的 path 值,这是在 cas 部署环境改变的情况下,灵活地设置 cookie path 的方式;把 cookie 的值以及 service 参数的值放入 requestContext 的 flowscope 里。 2 : GenerateServiceTicketAction 此 Action 负责根据 service 、 GTC cookie 值生成 ServiceTicket 对象, ServiceTicket 的 ID 就是返回给客户应用的 ticket 参数,如果成功创建 ServiceTicket ,则转发到 WarnAction ,如果创建失败,且 gateway 参数为 true ,则直接redirect 到客户应用, 否则则需要重新认证。 3 : viewLoginForm 这是登录页面, CAS 在此收集用户凭证。 CAS 提供的默认实现是 /WEB-INF/view/jsp/simple/ui/casLoginView.jsp 。 4 : bindAndValidate 对应 AuthenticationViaFormAction 的 doBind 方法,该方法负责搜集登录页面上用户录入的凭证信息(用户名、密码等),然后把这些信息封装到 CAS 内部的 Credentials 对象中。用户在 casLoginView.jsp 页面上点击提交后,会触发此方法。 5:submit 对应 AuthenticationViaFormAction 的 submit 方法 , 如果 doBind 方法成功执行完, 则触发 submit 方法,此方法负责调用centralAuthenticationService 的 grantServiceTicket 方法,完成认证工作,如果认证成功,则生成 TicketGrantingTicket 对象,放在缓存里, TicketGrantingTicket 的 ID 就是 TGC Cookie 的 value 值。 6 : warn CAS 提供了一个功能:用户在一个 web 应用中跳到另一个 web 应用时, CAS 可以跳转到一个提示页面,该页面提示用户要离开一个应用进入另一个应用,可以让用户自己选择。用户在登录页面 viewLoginForm 上选中了 id=”warn ” 的复选框,才能开启这个功能。 WarnAction 就检查用户有没有开启这个功能,如果开启了,则转发到showWarnView, 如果没开启,则直接redirect 到客户应用。 7 :SendTicketGrantingTicketAction 此Action 负责为response 生成TGC Cookie ,cookie 的值就是 AuthenticationViaFormAction 的submit 方法生成的 TicketGrantingTicket 对象的 ID 。 8 : viewGenerateLoginSuccess 这是 CAS 的认证成功页面。 /logout: ( 对应实现类 org.jasig.cas.web.LogoutController ) 处理逻辑: 1) removeCookie 2) 在服务端删除TicketGrantingTicket 对象(此对象封装了cookie 的value 值) 3 )redirect 到退出页面,有2 种选择: if(LogoutController 的followServiceRedirects 属性为true 值,且url 里的service 参数非空){ redirect 到 sevice 参数标识的url } else{ redirect 到内置的casLogoutView (cas/WEB-INF/view/jsp/default/ui/casLogoutView.jsp ),如果url 里有url 参数,则此url 参数标识的链接会显示在casLogoutView 页面上。 } /serviceValidate: (对应实现类 org.jasig.cas.web.ServiceValidateController ) 处理逻辑: 如果service 参数为空或ticket 参数为空,则转发到failureView (/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationFailure.jsp ) 验证ticket 。以ticket 为参数,去缓存里找ServiceTicketImpl 对象,如果能找到,且没有过期,且ServiceTicketImpl 对象对应的service 属性和service 参数对应,则验证通过,验证通过后,请求转发至casServiceSuccessView (cas/WEB-INF/view/jsp/default/protocol/2.0/casServiceValidationSuccess.jsp ),验证不通过,则转发到failureView 。 三、认证相关的概念及流程 概念 ∙ Credentials 用户提供的用于登录用的凭据信息,如用户名/ 密码、证书、IP 地址、Cookie 值等。比如 UsernamePasswordCredentials ,封装的是用户名和密码。CAS 进行认证的第一步,就是把从UI 或request 对象里取到的用户凭据封装成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 完成认证逻辑。 序列图


