CAS在tomcat6.0.18下的SSO
(一)CAS实现原理
术语:
CAS(Central Authentication Service)
TGT(Ticket Granting Ticket)
ST(Service Ticket)
PGT(Proxy Granting Ticket)
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:
图 1. CAS 基础协议
复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。
(二)需要介质
1、 客户端介质cas-client-java-2.1.1.zip
2、 服务端介质cas-server-3.3.3-release.zip
3、 Tomcat6.0
4、 JDK6.0
(三)配置步骤
1、安装JDK6.0与tomcat6.0(略)
2、配置Java环境变量和tomcat环境变量
(1) JDK环境变量配置:
如果你的JDK安装在C盘里,如:C:\j2sdk1.4.2_05,那么就在系统变量里(当然也可以在用户变量里)点新建:
变量名:JAVA_HOME
变量值:C:\j2sdk1.4.2_05
再次点新建:
变量名:classpath
变量值:.;%JAVA_HOME%\lib\dt.jar;
并在path里加入 .;%JAVA_HOME%\bin;
测试:
启动:运行cmd
Dos命令下分别输入Java和JavaC后回车
(2) Tomcat环境变量配置:
如果你的Tomcat安装在C盘里,如:F:\Tomcat50(在这里切记一下,安装Tomcat时,在其字母周围
一定不要存在空格,否则最后可能导致配置不成功)
同样,在系统变量里点新建:
变量名:CATALINA_BASE
变量值:C:\apache-tomcat-6.0.18\apache-tomcat-6.0.18
再次新建:
变量名:CATALINA_HOME
变量值:C:\apache-tomcat-6.0.18\apache-tomcat-6.0.18
点击确定后在classpath中加入%CATALINA_HOME%\common\lib\servlet-api.jar;
在path中加入%CATALINA_HOME%\lib;
测试:
进入%CATALINA_HOME%bin
运行startup.bat
(四)配置ssl协议
背景:作为服务机与客户机通信的协议
步骤:
3.1生成keystore
在命令行下使用如下命令:
C:\Documents and Settings\administrator>keytool -genkey -alias mykey -keyalg RSA -keystore server.keystore
输入keystore密码:123456
再次输入新密码:123456
您的名字与姓氏是什么?
[Unknown]: 主机名或者IP最好是做了host映射的主机名
您的组织单位名称是什么?
[Unknown]: capinfo
您的组织名称是什么?
[Unknown]: capinfo
您所在的城市或区域名称是什么?
[Unknown]: beijing
您所在的州或省份名称是什么?
[Unknown]: beijing
该单位的两字母国家代码是什么
[Unknown]: cn
CN=fengqingyu, OU=capinfo software ltd., O=capinfo, L=beijing, ST=beijing, C=cn 正确吗?
[否]: y
输入<mykey>的主密码
(如果和 keystore 密码相同,按回车):
在C:\Documents and Settings\new下可以找到一个文件:server.keystore,其中就包含了自签名的证书。
注意:
这里要求certificate keystore 和certificate的密码一致,此为Tomcat的约束。
如果服务端和应用端在同一台电脑上,还可以使用批处理文件:
@echo off
if "%JAVA_HOME%" == "" goto error
@echo on
@echo off
cls
rem please set the env JAVA_HOME before run this bat file
rem delete alia tomcat if it is existed
keytool -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
keytool -delete -alias tomcatsso -storepass changeit
REM (注释: 清除系统中可能存在的名字为tomcatsso 的同名证书)
rem list all alias in the cacerts
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
REM (注释: 列出系统证书仓库中存在证书名称列表)
rem generator a key
keytool -genkey -keyalg RSA -alias tomcatsso -dname "cn=ls" -storepass changeit
REM (注释:指定使用RSA算法,生成别名为tomcatsso的证书,存贮口令为changeit,证书的DN为"cn=linly" ,这个DN必须同当前主机完整名称一致哦,切记!!!)
rem export the key
keytool -export -alias tomcatsso -file "%JAVA_HOME%/jre/lib/security/tomcatsso.crt" -storepass changeit
REM (注释: 从keystore中导出别名为tomcatsso的证书,生成文件tomcatsso.crt)
rem import into trust cacerts
keytool -import -alias tomcatsso -file "%JAVA_HOME%/jre/lib/security/tomcatsso.crt" -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
REM (注释:将tomcatsso.crt导入jre的可信任证书仓库。注意,安装JDK是有两个jre目录,一个在jdk底下,一个是独立的jre,这里的目录必须同Tomcat使用的jre目录一致,否则后面Tomcat的HTTPS通讯就找不到证书了)
rem list all alias in the cacerts
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
pause
:error
echo 请先设置JAVA_HOME环境变量
:end
3.2添加keystore目录
在%TOMCAT_HOME%目录下新建目录keystore,并拷贝server.keystore到其目录下。
3.3修改配置文件
修改%TOMCAT_HOME%/conf/server.xml文件。添加https的Connector。
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="conf/.keystore" keystorePass="changeit"
truststoreFile="C:/Program Files/Java/jdk1.6.0_23/jre/lib/security/cacerts"
clientAuth="false" sslProtocol="TLS"/>
注意:
1)keystoreFile指向文件%TOMCAT_HOME%/conf/.keystore文件。
2)keystorePass就是刚才生成certificate keystore的密码。
3)测试Https。访问https://localhost:8443/,提示有不安全的证书,接受证书,看到可亲的tom猫
4)访问的时候localhost最好换成你的主机名。
至此SSL协议配置结束。
4、搭建CAS的服务端
4.1 CAS在tomcat上的发布
1)将下载的cas-server-3.3.3-release.zip解压
2)将解压包内的modules文件夹下的cas-server-webapp-3.3.3.war 拷贝到 tomcat的 webapps 目录,并更名为 cas.war
可以重新启动 tomcat,然后访问:https://localhost:8443/cas ,如果能出现正常的 CAS 登录页面,则说明 CAS Server 已经部署成功。
5、 搭建CAS客户端
1、 配置客户端服务器的HTTPS协议方法同服务端。
2、 客户端的安装
1) 将cas-client-java-2.1.1.zip解压并将\cas-client-java-2.1.1\dist下的casclient.jar拷贝到你所要应用的项目的WEB-INF\lib目录下
2) 将\cas-client-java-2.1.1\lib下的所有包copy到WEB-INF\lib目录下
3、 密钥的交换。
1) 服务端密钥的导出
C:\Documents and Settings\administrator>keytool -export -file client.cert -alias mykey -keystore server.keystore
2)客户端密钥的导入
将导出的client.cert密钥copy到客户端机器上在客户端机器上运行
keytool -import -trustcacerts -file client.cert -keypass changeit -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -alias mykey1
注意:
导入的部位是
JAVA_HOME的jre目录下,不是跟jdk同级的jre目录
例如: C:/Program Files/Java/jdk1.6.0_03/jre/lib/security/cacerts
4、 配置文件的修改
1) 修改webapps\examples\WEB-INF\web.xml,加入servlet filter实现SSO检查。
注:该web.xml为你要加入SSO功能的项目下的web.xml文件,本示例为使用tomcat下自带的example项目
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://cas02.com.cn:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://cas02.com.cn:8443/cas/proxyValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>cas02.com.cn:8080</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.wrapRequest</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:本测试案例的服务端与客户端在同台机器下所以地址栏中全使用了同一主机名,如客户机与服务机在不同机器上,则第一二两个表红色的主机名要换成服务机的主机名,第三个标蓝色的主机名为客户机的主机名。
6、 测试SSO
1)通过IE访问http://主机名:8080后进入TOMCAT页面后选择example会跳转到CAS得登录面输入相同的用户名密码进入example的登录后页面,至此该简单的SSO结束
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。
CAS单点登出的设置:
-、在应用页面加入如下标签:
1、登出后重定向登录页面,所以首先在 cas-servlet.xml中加入红色的部分:
<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:logoutView="casLogoutView"
p:warnCookieGenerator-ref="warnCookieGenerator"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"
p:followServiceRedirects="true" />
二、 当应用系统需要设置用户登出的超链接时:
1. 因为使用的是CAS应用系统端的自定义标签,所以首先要把cas.tld文件复制到应用系统的WEB-INF目录下,在web.xml中注册cas.tld文件代码如下:
<jsp-config>
<taglib>
<taglib-uri>cas</taglib-uri>
<taglib-location>/WEB-INF/cas.tld</taglib-location>
</taglib>
</jsp-config>
说明:红色部分修改为WEB-INF目录下存放cas.tld文件的目录。
2. 将logout.jsp文件拷到当前应用系统的工程中(这个jsp页面可以不用通过CAS过滤器),关键代码如下:
例子:<cas:logout
var="edu.yale.its.tp.cas.client.filter.user"
logoutUrl="https://ssoi.uyunke.com:8443/cas/logout?service=http://my.app.com:8080/testssob/html/test2.jsp"
scope="session"/>
代码说明:
l 其中红色部分修改为登录当前应用系统的jsp的URL路径;
3. 在要加入登出的地方加入如下代码:
<a href="<eaglelink:contextpath/>/html/logout.jsp">登出</a>
代码说明:
l <eaglelink:contextpath/>是上下文路径
l 红色部分为上面创建的logout.jsp页面的路径