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 完成认证逻辑。

序列图

标签: