单点登录(SSO)、CAS介绍

1.引言

1.1 编写目的

       记录使用CAS实现SSO的过程。

1.2 术语定义

CAS: 全称JA-SIG Central Authentication Service,实现SSO的开源项目。

SSO: 即Single sign on,单点登录

1.3 所需安装文件清单

     密钥库文件: cas.com.keystore(此文件包已经在安装包中提供,用户可以根据制作服务器安全证书环节描述自行生成)

     密钥证书:   case.com.crt(此文件包已经在安装包中提供,用户可根据制作服务器安全证书环节描述自行生成)。

     CAS服务安装包:cas.war

1.4 软件环境

JDK1.5+

Tomcat6.x(之前配置用版本5的没有成功,后来换成6的就可以了)

WindowsXP

MySQL5+

2.概述

2.1 背景

单点登录(Single Sign On,简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS(Central Authentication Service)是一款不错的针对Web应用的单点登录框架,这里就说说使用CAS实现SSO的方式。 

2.2CAS原理和协议

    单点登录的原理是通过拦截你设定的URL,并跳转到你指定的CAS Server登录页,当你登录成功后,呆着Ticket,返回到你打开的URL.然后你就可以一票在手,畅通无阻。

    从结构上看,CAS包含两个部分:CAS Server 和CAS Client需要独立部署,主要负责对用户的认证工作;CAS Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server.图1是CAS最基本的协议过程:

CAS Client 与受保护的客户端应用部署在一起,Filter方式保护Web 应用的受保护资源,过滤从客户端过来的每一个Web 请求,同时, CAS Client会分析HTTP请求中是否包请求 Service Ticket(上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的,于是,CAS Client会重定向用户请求到CAS ServerStep 2 )。 Step 3是用户认证过程,如果用户提供了正确的CredentialsCAS Server 会产生一个随机的Service Ticket ,然后,缓存该Ticket ,并且重定向用户到CAS Client(附带刚才产生的Service Ticket),Service Ticket 是不可以伪造的,最后,Step 5 Step6 CAS Client CAS Server之间完成了一个对用户的身份核实,用Ticket查到Username ,因为 Ticket CAS Server产生的,因此,所以 CAS Server的判断是毋庸置疑的。

      该协议完成了一个很简单的任务,所有与CAS的交互均采用SSL协议,确保ST和TGC的安全性。协议工作过程会有2此重定向过程,但是CAS Client与CAS Server之间进行ticket验证的过程对于用户是透明的。

 

3.安装步骤

3.1系统环境安装

3.1.1 JDK安装

配置环境变量:JAVA_HOME=c:\Program File\Java\jdk1.6.0_06

               Path=%JAVA_HOME\bin

               CALSS=.;%JAVA_HOME\lib\tools.jar;%JAVA_HOME\lib\dt.jar

3.1.2MySQL安装

MySQL安装,建库和建一张users表,包含account,password字段,数据自行建立。

注意:如果password是采用MD5加密,表中password字段数据相应也应是MD5加密。

3.1.3 Tomcat安装

Tomcat的安装需要注意,安装路径中不能有空格存在。

3.1.4 SSL安全连接配置

集中操作维护需要用到SSL安全连接,其中women需要配置Tomcat的8443端口(如用Oracle,则Tomcat为7443或6443端口,端口与必须以443结尾)

3.1.4.1  制作服务器安全证书

keytool为JDK自带的证书管理工具,我们使用keytool进行证书的生成以及管理,详细步骤如下:

生成一对密钥并存储在密钥库里:打开命令行窗口执行命令keytool -genkey -alias cas.com -keyalg RSA -keystore cas.com.keystore,命令执行成功,屏显信息类似下面表格中内容.

*-genkey参数为生成一对密钥

*-alias为此密钥对命名别名,这个需要记住,下一步到处证书的时候需要这个是一项必要参数(即要说明从哪个密钥库里导出证书)。

*-keyalg RSA指的是采用RSA算法

*-keystore是指生成的证书存储的位置

*密码输入后会让你输入一些其他信息,记得这里第一个姓名必须是服务器的域名或者完整的计算机名称。

*其中的-dname即为证书的唯一名称,选项中的cn参数为CAS服务器所在机器的域名或计算机名,CAS建议不要使用IP名,这个很重要,我们这里sso.cas.com,那么在集成了CAS服务的系统中需要添加一条域名与IP的映射信息,剩余ou/o/c分别为单位/组织/国家信息,根据实际情况填写即可。

*-keypass为证书密码;-keystore为密钥库文件名;-storepass为密钥库的密码;validity为此证书有效期。

 c:\admin>keytool -genkey -dname "cn=sso.cas.com,ou=cas,o=cas,c=CN" -alias cas.com -keypass 123456 -keystore cas.com.keystore -storepass 123456 -validity 180

c:\admin>dir \find "cas.com.keystore"

2011-12-21 18:32 1173 cas.com.keystore

 命令执行成功后将在当前目录生成cas.com.keystore文件,参见上方表格中得内容。

如果未能执行成功,可能是JDK环境变量配置不正确。

导出证书,在港口的命令窗口执行如下命令

*-export 就是说明要到处证书。

*-file 是指明要从哪个密钥库里导出,我们这里配置刚才在上一步生成的cas.com.keystore文件。

*-storepass即为我们上步中填写的-storepass 这里为123456

*-alias为此证书的别名

  c:\admin>keytool -export -file cas.com.crt -keystore cas.com.keystore -storepass 123456 -alias cas.com

保存在文件中的认证<cas.com.crt>

为客户端的JVM导入密钥

  c:\admin>keytool -import -file cas.com.crt -alias cas.com.keystore c:/Program Files/Java/jdk1.6.0_06/jre/lib/security/cacerts

输入密码: changeit ,这个是默认密码。

  特别说明这个JDK路径是指的JDK的JRE路径下的lib目录。

如果有产生不需要的证书导入到了cacerts,可以删除该证书

  c:\admin>keytool -delete -alias cas.com -keystore cacerts

3.1.4.2配置HOST c:/windows/system32/drivers/etc/hosts

  127.0.0.1  cas.com.keystore

3.1.4.3 修改tomcat配置文件:/conf/server.xml

 <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->

<Connector SSLEnabled="true" clientauth="false" keystoreFile="conf/cas.com.keystore" keystorePass="123456" maxThreads="150"

                     port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS" />

3.2配置CAS Server

CAS Server是一个web应用包,部署在web服务器上,负责完成对用户的认证工作,另外由于Client与CAS Server之间的交互采用Https协议,因此部署CAS Server的服务器还需要支持SSL协议。当SSL配置成功过后,像普通web应用一样将CAS Server部署在服务器上就能正常运行了。

 CAS Server会处理用户名/密码等凭证(Credentials),它可能会倒数据库检索一条用户账号信息,也可能在XML文件中检索用户密码,CAS均提供一种灵活但统一的接口/实现分离方式,CAS究竟用何种认证方式,跟CAS协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展。

3.2.1 配置CAS Server环境

#将CA证书,即cas.com.keystore文件拷贝到%tomcat5%/conf目录下

#CAS Server部署依赖包cas-server-core-3.4.7.jar cas-server-support-jdbc-3.4.7.jar

#配置CAS验证数据库,即配置/cas/Webcontent/WEB-INF/deployerConfigcontext.xml这个文件。

#其中需要修改的内容 select password from users where account=? , users /password/account请分别填写实际的用户表和用户密码以及登录用户名字段。

#当采用MD5进行加密,数据库中的用户密码字段一定要是MD5进行过的,否则会登录错误。

 

  下载cas-server-3.3\modules,复制cas-server-webapp-3.3.war到tomcat\webapps瞎,修改名称为cas.war,然后启动IE,输入http://localhost:8080/cas 检验是否可以访问,如果可以,则输入相通的用户名和密码,测试是否可以登录。

 <bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">

         <property name="credentialsToPrincipalResolvers">

                    <list>

                           <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver"/>

                           <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver"/>

                    </list>

          </property>

          <property name="authenticationHandlers">

                    <list>

                           <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"/>

                           <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

                           <property name="sql" value="select password from users where account=?"/><!--根据实际情况修改 -->

                          <property name="dataSource" ref="dataSource"/>

                          <property name="passwordEncoder" ref="MD5passwordEncoder"/>

                         </bean>

                    </list>

          </property>

</bean>

<!--根据实际情况配置 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

          <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

          <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>

          <property name="username" value="uname"/>

         <property name="password" value="upassword"/>

</bean>

<bean id="MD5passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordencoder">

                  <constructor-arg index="0">

                             <value>MD5</value>

                  </constructor-arg>

</bean>

       

到 CAS 官方网站下载 CAS Server 和 Client,地址分别为:

http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip 

将CAS Server发布包拷贝到%tomcat%/webapps/目录下。

由于前面已配置好tomcat的https协议,可以重新启动tomcat,然后访问 https://localhost:8443/sso(工程名) 如果能出现工程登录页面,则说明CAS Server已经部署成功。

3.2.2 CAS Client部署

CAS Client负责部署在客户端(web应用),原则上,CAS Client的部署意味着,当有对本地web应用的受保护资源的访问请求,并且需要对请求方进行身份验证,web应用不再接受任何的用户密码等类似的Credentials,而是重定向到CAS Server进行认证。

CAS Client以Filter方式保护web应用的受保护资源,过滤从客户端过来的每一个web请求,同时,CAS Client会分析HTTP请求中是否包请求Service Ticket,如果没有,则说明该用户是没有经过认证的。于是,CAS Client会重定向用户请求到CAS Server.如果用户提供了正确的Credentials , CAS Server会产生一个随机的Service Ticket,然后,缓存该Ticket,并且重定向用户到CAS Client(附带刚才产生的Service Ticket),Service Ticket是不可伪造的,最后是CAS Client和CAS Server之间完成了一个对用户的身份核实,用Ticket查到username,因为Ticket是CAS Server产生的,所以CAS Server的判断是毋庸置疑的。

单点登录的母的是为了让多个相关联的应用使用相同的登录过程,本过程中在eclipse 中构造2个简单的web工程。分别以castest1和castest2来作为实力,他们均只有一个页面,显示欢迎信息即可。通过本文的配置,实现单点登录,即只需登录一次就可以访问这两个应用。

在Eclipse建立的客户端工程中加入 casclient.jar和cas-client-core-3.2.0.jar.修改web.xml文件,添加CAS Filter。 如清单所示:

<web-app>
...
<filter>
<filter-name>CAS Filter</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://localhost:8443/sso/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://cas.com.keystore:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

...
</web-app>

# edu.yale.its.tp.cas.client.filter.loginUrl         指定CAS提供登录页面的URL

#edu.yale.its.tp.cas.client.filter.validateUrl     指定CAS提供service ticket或proxy ticket验证服务的URL

#edu.yale.its.tp.cas.client.filter.serverName   指定客户端的域名和端口,是指客户端应用所在机器而不是CAS Server所在机器

在上面配置结束后,启动tomcat

 

#验证服务器端

打开浏览器,访问https://localhost:8443/sso ,浏览器会弹出服务端登录页,登录后即转到登录页面。

#验证客户端

打开浏览器,访问http://localhost/casetest1,浏览器会弹出安全提示,接收后即转到SSO登录页面,登录成功后,再定向到casetest1的首页面,可以看到地址栏里的地址多出了一个ticket参数,这就是CAS分配给当前应用的ST(Service Ticket);

再在同一个窗口打开浏览器,访问http://localhost/casetest2,浏览器会弹出安全提示,接受后即转到SSO登录页面,登录成功后,再定向到casetest2的首页面。之后再在地址栏重新输入http://localhost/casetest1,会直接显示 casetest1的页面而无需再次登录。

 

结束语

本文档介绍了CAS单点登录解决方案的原理,并结合实例讲解了在tomcat中使用CAS的配置、部署方法和效果,CAS是作为开源单点登录解决方案的一个不错的选择,更多使用细节可以参考CAS官方网站。

猜你喜欢

转载自blog.csdn.net/guoyf123321/article/details/52116717