介绍
单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
CAS(CentralAuthenticationService)是耶鲁大学的开源项目,旨在为Web应用系统提供一种可靠的单点登录解决方法。
CAS开始于年,并在年12月正式成为JA-SIG的一个项目。
编写目的
本文档作为sodb应用系统认证集成手册,旨在指导sodb集成系统实现统一身份认证和登录集成。
包括了SSL安全证书认证、CAS客户端配置。
术语与缩略语
整体认证流程
流程说明:
1、app端有session时,无需再次请求cas服务端(实线部分的流程即可)。
2、app端有st,则直接校验即可(无须重定向到cas服务端获取st)。
3、只有当1、2都不满足,或者校验不通过时,才会唤起输入用户名和密码的页面。
4、cas是集成了spring-webflow的,而对应的信息又保存在cas_server端的session中。所以要分布式部署的话,不能忘了session的共享。
票据说明:
1、TGC(Ticket-grantingcookie),是存放在浏览器中的,从它是名字就能判断出来。
2、包含用户信息的session保存在app服务端和cas的服务端
3、TGT(Ticket-grantingTicket),ST(ServiceTicket)存放在cas服务端中。要实现上图的分布式部署,将其存入共用的数据库即可。
单点登录实现方案
单点登录概述
单点登录,即用户只登录一次,在其随后访问所有的授权的资源时,都不需要再次登录。本方案使用CAS产品为基础来实现。
CAS(CentralAuthenticationService)是Yale大学发起的一个开源项目,据统计,大概每10个采用开源构建WebSSO的Java项目,就有8个使用CAS。下方主要介绍CAS结构体系、协议与安全性。
CAS结构体系
从结构体系看,CAS包含两部分:
1)CASServer
CASServer负责完成对用户的认证工作,CASServer需要独立部署。
CASServer会处理用户名/密码等凭证(Credentials),可通过连接到LADP检索用户名密码信息,也可能在XML文件中检索用户密码,对这种方式,CAS均提供一种灵活但统一的接口/实现分离的方式,CAS究竟是用何种认证方式,跟CAS协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展。
2)CASClient
CASClient负责部署在客户端(注意,我是指Web应用),原则上,CASClient的部署意味着,当有对本地Web应用的受保护资源的访问请求,并且需要对请求方进行身份认证,Web应用不再接受任何的用户名密码等类似的Credentials,而是重定向到CASServer进行认证。
CAS协议
1)基础协议
CAS基础模式
上图是一个最基础的CAS协议,CASClient以Filter方式保护Web应用的受保护资源,过滤从客户端过来的每一个Web请求,同时,CASClient会分析HTTP请求中是否包请求ServiceTicket(上图中的Ticket),如果没有,则说明该用户是没有经过认证的,于是,CASClient会重定向用户请求到CASServer(Step2)。Step3是用户认证过程,如果用户提供了正确的Credentials,CASServer会产生一个随机的ServiceTicket,然后,缓存该Ticket,并且重定向用户到CASClient(附带刚才产生的ServiceTicket),ServiceTicket是不可以伪造的,最后,Step5和Step6是CASClient和CASServer之间完成了一个对用户的身份核实,用Ticket查到Username,因为Ticket是CASServer产生的,因此,所以CASServer的判断是毋庸置疑的。
该协议完成了一个很简单的任务,就是User(ah.zhangsan)打开IE,直接访问某一应用A,它被立即重定向到CASServer进行认证,User可能感觉到浏览器在应用A和casserver之间重定向,但User是看不到,CASClient和CASServer相互间的ServiceTicket核实(Validation)过程。当CASServer告知CASClient用户ServiceTicket对应确凿身份,CASClient才会对当前Request的用户进行服务。
2)CAS如何实现SSO
CAS可以很简单的实现跨域的SSO,因为,单点被控制在CASServer,用户最有价值的TGC-Cookie只是跟CASServer相关,CASServer就只有一个,因此,解决了cookies不能跨域的问题。
1.如果User的持有TGC且其还没失效,那么就进行基础协议图的Step4,达到了SSO的效果。
2.如果TGC失效,那么用户还是要重新认证进行基础协议图的Step3。
CAS安全性
CAS的安全性是一个非常重要的Topic。CAS从v1到v3,都很依赖于SSL,它假定了这样一个事实,用户在一个非常不安全的网络环境中使用SSO,Hacker的Sniffer会很容易抓住所有的HttpTraffic,包括通过Http传送的密码甚至Ticket票据。
2.3.1TGC/PGT安全性
对于一个CAS用户来说,最重要是要保护它的TGC,如果TGC不慎被CASServer以外的实体获得,Hacker能够找到该TGC,然后冒充CAS用户访问所有授权资源。
SSO的安全性问题比普通应用的安全性还要严重,因为SSO存在一种门槛效应。以前即使Hacker能够截获用户在Web应用A的密码,它也未必能知道用户在Web应用B的密码,但SSO让Hacker只需要截获TGC(突破了门槛),即能访问所有与该用户相关的所有应用系统。
PGT跟TGC的角色是一样的,如果被Hacker获得,后果可想而知。
从基础模式可以看出,TGC是CASServer通过SSL方式发送给终端用户,因此,要截取TGC难度非常大,从而确保CAS的安全性。所以CAS的传输安全性依赖于SSL。
2.3.2ServiceTicket/ProxyTicket安全性
ServiceTicket是通过Http传送的,意味着所网络中的其他人可以Sniffer到其他人的Ticket。
CAS协议从几个方面让ServiceTicket变得更加安全。
·ServiceTicket只能使用一次
CAS协议规定,无论ServiceTicket验证是否成功,CASServer都会将服务端的缓存中清除该Ticket,从而可以确保一个ServiceTicket不被使用两次。
·ServiceTicket在一段时间内失效。
假设用户拿到ServiceTicket之后,他请求helloservice的过程又被中断了,ServiceTicket就被空置了,事实上,此时,ServiceTicket仍然有效。CAS规定ServiceTicket只能存活一定的时间,然后CASServer会让它失效。通过在web.xml中配置下面的参数,可以让ServiceTicket在多少秒内失效。该参数在业务应用的条件范围内,越小越安全。
·ServiceTicket是基于随机数生成的
ServiceTicket必须足够随机,如果ServiceTicket生成规则被猜出(如果你使用了ST+Helloservice+自增序列的方式,Hacker就可以构造下一个Ticket),Hacker就等于绕过CAS认证,直接访问所有服务。
CAS客户端配置
单点登录客户端集成,主要也就是配置了四个过滤器,和一个监听器。并且我们需要将用户信息和各个子系统进行同步。同时单点登录服务端配置了SSL,需要各个子系统导入证书到JDK中。
证书
证书文件:casserver.cer
导入证书
方式一:
keytool-import-trustcacerts-aliascasserver-fileE:\Cas-SSO\ssl\casserver.cer-keystore%JAVA_HOME%\jre\lib\security\cacerts
导入证书到jdk,输入确认命令的时候,是y不是yes
方式二:
keytool-import-aliascasserver-fileE:\Cas-SSO\ssl\casserver.cer-keystore%JAVA_HOME%\jre\lib\security\cacerts-storepasschangeit-trustcacerts
:-file指定证书的位置,也就是上一步导出证书的位置,命令中指定了JAVA_HOME,意思是将证书导入到客户端证书库,也就是jdk证书库中.因为客户端应用运行在本地,需要jdk的支持。回车之后,会让你输入密钥库口令,注意,这里的密码必须要输入changeit(jdk密码),不能输入上面指定的密码,切记,否则导入客户端证书会有问题,如果是多台机器演示,需要在每一台客户端导入该证书,步骤都是一样的。当看到提示是否信任此证书,输入y回车即可,见下图:(说明,命令中的-alias后面的别名可以自定义,如果出现的错误,该意思是说客户端的密钥库中已经存在该别名证书了,重新指定其他别名即可.)
证书查看
#查看证书信息
keytool-list-keystoreE:\Cas-SSO\ssl\cas
#查看jdk目录下的证书
keytool-list-keystore%JAVA_HOME%\jre\lib\security\cacerts
findstr/icasserver
keytool-list-keystore%JAVA_HOME%\jre\lib\security\cacerts-aliascasserver
配置hosts
环境准备
·jdk1.8
·apache-tomcat-8.5.15
·cas-client-core-3.4.0.jar、