CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法。它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护的资源的访问请求,CAS的原理如下图所示:
上述的6个步骤解释如下:
1.用户通过browser请求cas client A端的资源。
2.client A端发现用户未登录(client没有收到ST),redirect到cas server,并且把用户请求服务的url发送给server;server发现用户浏览器中没有TGC(Ticket Granting Cookie),就跳转到登录页面。
3.用户在登录页面登录并登录成功。
4.server在用户的浏览器中设置一个TGC(Ticket Granting Cookie),并且在server端保存一个TGT(Ticket Granting Tciket),然后把用户重定向到{client A网址+ST(Service Ticket)},其中ST是由TGT生成的。
5.client A端通过GET的方法收到ST,向server端验证这个ticket的有效性,这一步主要是为了防止恶意用{client网址+杜撰的ST}来访问client A,所以虽然ST是server发送给client A的,client A仍然需要向server验证其有效性。
6.ticket有效,server端返回ticket对应的用户的用户名,client A端为用户提供请求的服务。
上述是未登录的用户访问client A的过程,用户通过以上步骤已经登录了CAS系统,此时他访问CAS系统中信任的client B端,是不用登录的,实现步骤如下:
1.1.用户通过browser请求cas client B端的资源。
2.client B端发现没有收到ST,redirect到cas server,并且把用户请求服务的url发送给server;server发现用户浏览器中有TGC(Ticket Granting Cookie),验证该TGC后,用server端存储的TGT生成一个ST。
3.server把用户重定向到{client B网址+ST(Service Ticket)}。
4.client B端通过GET的方法收到ST,向server端验证这个ticket的有效性.
5.ticket有效,server端返回ticket对应的用户的用户名,client B端为用户提供请求的服务,这样用户就不用再次登录就可以访问到client B了。
所以从上述过程中,可以看到client端既不能接触到用户的用户名密码,也不能接触到用户的凭证TGT或者TGC,它只做两件事情:如果用户的请求里有ST,那么就向服务器验证ST的有效性;如果用户的请求里没有ST,那么就把用户重定向到cas server;
cas server全权负责管理用户的用户名和密码,如果发现用户的浏览器里面有有效的TGC,就生成ST把用户重定向到client端;如果用户浏览器里面没有TGC或者TGC无效,就让用户重新登录,然后在用户的浏览器里面设置新的TGC。而server和用户浏览器之间的交互是https安全协议,这样就保证了用户的用户名密码的安全性。
本文记录server端的搭建过程。
1.安装JDK
2.搭建TOMCAT:
3.配置tomcat使用https协议
(1)生成安全证书
cd到%JAVA_HOME%/bin/目录下,执行一下命令
Keytool -genkey -alias tomcat_key -keyalg RSA -storepass changeit -keystore server.keystore -validity 3600
其中"server.keystore"是保存生成证书的路径和名称。
在接下来的操作中,要注意的是“您的名字和姓氏是什么?”这里要回答域名,比如我是在本机搭建tomcat,所以回答localhost,如下图所示:
其他的随便填就好了。此时会在%Tomcat_home%下生成server.keystore文件。
注:参数-validity指证书的有效期(天),缺省有效期很短,只有90天。
(2)将证书导入的JDK的证书信任库中
这步对于Tomcat的SSL配置不是必须,但对于CAS SSO是必须的,否则会出现如下错误:
Edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidate.
导入过程分2步,第一步是导出证书,第二步是导入到证书信任库,命令如下:
Keytool -export -trustcacerts -alias tomcat_key -file server.cer -keystore server.keystore -storepass changeit
Keytool -import -trustcacerts -alias tomcat_key -file server.cer -keystore C:/”Program Files”/Java/jdk1.7.0_01/jre/lib/security/cacerts -storepass changeit
如果有提示,输入Y就可以了。
其它有用keytool命令(列出信任证书库中所有已有证书,删除库中某个证书):
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts >t.txt
keytool -delete -trustcacerts -alias tomcat_key -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
(3)配置Tomcat
在Tomcat的server.xml配置文件中加入:
port="8443" minSpareThreads="5" maxSpareThreads="75" enableLookups="true" disableUploadTimeout="true" acceptCount="100" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:/Program Files/Apache Software Foundation/Tomcat 7.0/server.keystore" truststoreFile="C:/Program Files/Java/jdk1.7.0_01/jre/lib/security/cacerts" keystorePass="changeit"/> 本文使用的CAS Server版本是3.5.2,下载地址:https://www.apereo.org/cas/download。 部署CAS Server的步骤如下: 1. 到CAS网站下载CAS Server。 2. 解压压缩文件,在解压后的文件夹内找到/modules/ cas-server-webapp-3.5.2.war,将cas-server-webapp-3.5.2.war复制到%Tomcat_Home%\webapps下并改名为cas.war. 3. 启动Tomcat,测试https://localhost:8443/cas/login看是否访问正常。 如果出现一下界面则说明CAS Server配置成功: 4. 修改配置文件deployerConfigContext.xml。(可选)//这里是使用数据库中的username和password作为中央主证服务器(cas)的认证用户,如果不设置,当访问cas时,只要用户名和密码一致即可通过认证。CAS Server默认登陆验证方式是SimpleTestUsernamePasswordAuthenticationHandler,也就是用户名和密码一致都可以登陆;但我们通常需要从数据库中取出用户名和密码进行验证,所以我们需要修改deployerConfigContext.xml,配置我们自己的服务认证方式: (1)下载mysql-connector-java-5.1.22-bin.jar包。到cas-server-3.5.2\modules\目录下找到cas-server-support-jdbc-3.5.2.jar。 把上述两个包拷贝到apache-tomcat-7.0.56\webapps\cas\WEB-INF\lib\目录下。 (2)配置apache-tomcat-7.0.56\webapps\cas\WEB-INF\目录下的deployerConfigContext.xml文件: 前提,创建一个库,再创建一张表,表字段有username和password 首先增加一个datasource,通过增加一下的代码实现: 然后改变认证方式,定位到如下代码: 把它注释掉,换成: 其中 注意这里datasource放在注释掉的那行代码所在的外面,大概相对位置见下面的代码,否则会报错: (3)重启tomcat,再次到登录页面https://localhost:8443/cas/login上,就可以用数据库中的用户名和密码登录了,比如这里数据库中有的"test01","psw01"登录:4.部署CAS Server到Tomcat