ubuntu 18.04安装CAS 5.3全记录
注:本文初次发布于 https://bbs.huaweicloud.cn/forum/forum.php?mod=viewthread&tid=113841&page=1&authorid=70062 ,是《云享读书会》第九期《深入浅出Spring Security》读书笔记的一部分,因能独立成文,特发出来给大家参考。
一、CAS概念的引出
企业在建设IT系统时,往往会不断地扩充应用系统,以提高自身的业务能力,这些系统原先一般都有自己的登录模块。这就会造成系统增多之后,业务人员在操作各个系统时,极其不方便——在A系统(app1.my.com)登录一次,再在B系统(app2.my.com)登录一次。
这时,我们会在架构上做如下的调整:专门拉出一个系统(sso.my.com)——不做业务,只做登录;而其他系统——只做业务,不做登录。当后者(如app1.my.com)需要登录时,跳转到前面sso.my.com完成登录,就表示后者(如app1.my.com)完成了登录。也就是说,登录仅仅在一个系统(sso.my.com)中完成——顾名思义,称之为“单点登录”(Single Sing On,即SSO)。
而用户在浏览器输入完用户名和密码,提供单点服务的sso.my.com服务端会在内存中生成一个用户session(jsessionid),并在这个session中记录“已登录”状态,同时,如果使用cookie的话,会在浏览器写入Cookie(Set-Cookie:SessionID:xxx).这个Cookie也会成为用户的标识。
用户如果接着做进行业务操作,所有的请求会带着这个Cookie,服务端就会根据这个Cookie中的sessionId找到对应的用户Session,并根据Session的状态判断该用户是否已登录。
SSO包含同一个域下的单点登录和不同域下的单点登录。同一个域下的多个系统,由于Cookie不能跨域,我们可以将Cookie的域设置成my.com。这样所有子域的系统都可以访问my.com的Cookie。可以通过共享session(如Spring Session)的方式保证同一个用户在不同系统的sessionid一致,但这还不是真实意义的单点登录。
这里就引出一个CAS概念。CAS是Central Authentication Service,意思为中央验证服务。CAS由CAS Server和CAS Client组成。CAS中有几个概念:Ticket Granting Ticket(TGT)、Ticket Granted Cookie(TGC)和Service Ticket(ST)。其中:
(1)TGT类似于服务器Session,是用户登录的票根,包含用户认证身份以及有效期等等,存放在CAS Server中。
(2)TGC类似于会话ID,是存在Cookie中的一段数据,浏览器在跟CAS Server交互时,TGC可以帮助找到对应的TGT。
(3)ST是CAS Server签发的一次性票据。CAS Client使用ST跟CAS Server进行交互,获得用户的登录状态。
CAS的流程如下:
- 用户访问CAS Client的某个页面,如app1.my.com/hello
- CAS Client判断用户没有登录,会返回302状态码,指示浏览器重定向 如http://sso.my.com?service=app1.my.com/hello.在这里,service赋值为第一步的原访问地址。
- 浏览器携带service重定向到CAS Server。
- CAS Server获取Cookie中的的TGC,并以此查找TGT。如果找到,则认证完成。否则,会重定向到CAS Server的登录页面,如http://sso.my.com/login?service=app1.my.com/hello
- 用户在登录页面录入用户名,密码,点击登录。首次登录,CAS Server会生成TGT。每次验证时,CAS Server会根据TGT签发一个ST。将ST拼接在service中,并将TGC设置到用户Cookie中(域为sso.my.com)。并返回302状态码,指示浏览器重定向:http://app1.my.com/hello?ticket=xxx
- 浏览器将TGC写入的Cookie,并携带ticket(即ST)重定向到service即app1.my.com/hello的原业务页面。
- app1(CAS Client)拿到ticket,向CAS Server验证ticket的有效性
- 如果CAS Server验证是有效的,会告知CAS Client该ticket有效,并返回用户信息。
- app1将登录状态写入session,设置app1.my.com域下的cookie。
此时,如果用户访问另一个系统 app2.my.com,流程如下:
- 用户访问CAS Client的某个页面,如app2.my.com/hello
- CAS Client判断用户没有登录,会返回302状态码,指示浏览器重定向 如http://sso.my.com?service=app2.my.com/hello,在这里,service赋值为第一步的原访问地址。
- 浏览器携带service重定向到CAS Server。
- CAS Server获取Cookie中的的TGC,并以此查找TGT。此时因为用户在浏览器登录过,所以已经找到了。CAS Server会根据TGT签发一个ST,将ST拼接在service中,并返回302状态码,指示浏览器重定向:http://app2.my.com/hello?ticket=xxx
- 浏览器并携带ticket(即ST)重定向到service即app2.my.com/hello的原业务页面。
- app2(CAS Client)拿到ticket,向CAS Server验证ticket的有效性
- 如果CAS Server验证是有效的,会告知CAS Client该ticket有效,并返回用户信息。
- app2将登录状态写入session,设置app2.my.com域下的cookie。
(上图来自 https://blog.csdn.net/A_art_xiang/article/details/107028456 )
从以上的流程可以看出,用户在sso.my.com登录时,业务系统并不知道这件事情。所以需要业务系统app1或app2在拿到ticket之后,到CAS Server验证这个ST是否有效,如果有效才能被访问。
二、CAS 5.3的搭建
CAS Server的5以前的版本,使用的是jdk11+SpringBoot2;而CAS的6版本,使用的是jdk1.8+SpringBoot1。考虑到新版本还得搞Java 11.有点复杂,张小白还是决定安装CAS Server 5。
CAS的服务端搭建有2种方式,一个是使用源码构建,一个是使用WAR overlay的方式安装。CAS可以在Windows搭建,也可以在Linux搭建。这里选用了张小白熟悉的ubuntu 18.04(这个系统可以玩Atlas 200DK,也可以玩MindSpore,多玩一个系统应该也不是事儿)
1.准备软件包
打开 https://www.apereo.org/projects/cas 网页,
点击Download,会进入 https://github.com/apereo/cas 页面:
众所周知,这个页面很难打开。
我们需要利用 http://ipaddress.com
将github.com加入 C:\Windows\System32\drivers\etc\HOSTS 文件
再刷新DNS缓存:
再次打开github页面:
我们可以从官网下载相关的软件包,也可以自行准备,包含以下:
- jdk1.8.0
- apache-tomcat-8.5
- apache-maven-3.5.3
- cas-overlay-template-master
(前3个应该都能很容易下载到,最后一个如果需要需要的话,可以与我联系)。
将相关的软件包下载后,传入ubuntu系统(IP:192.168.40.133),并解压到 /home/cas/cas5.3的目录(目的可以自行调整)
编辑/etc/profile,并source使其生效:
可检查解压后的java和mvn版本:
2.tomcat启动与处理
先裸启tomcat
浏览器访问tomcat:
好像启动没啥问题。
下面开始制作tomcat的证书,以便使tomcat支持https访问。
生成server.keystore
keytool -genkey -alias tomcat -keyalg RSA -keypass tomcat -storepass tomcat -keystore server.keystore -validity 3600
这里面请注意一个细节,在系统询问“What is your first and last name?”的时候,记得这时输入CAS服务器的域名,也就是你规划好的SSO服务器的域名。否则,在CAS客户端连接后会报错。
生成证书
keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass tomcat
导入证书:
keytool -import -trustcacerts -alias tomcat -keystore "/home/cas/cas5.3/jdk1.8.0_171/jre/lib/security/cacerts" -file "/home/cas/cas5.3/apache-tomcat-8.5.31/server.cer" -storepass changeit
修改tomcat的配置文件server.xml(注意看截图中的路径)
找到 org.apache.coyote.http11.Http11NioProtocol http1.1的那段代码,做如下修改:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreFile="server.keystore" keystorePass="tomcat" >
<!--
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
-->
</Connector>
重启tomcat
再打开 https://192.168.40.133:8443/ 端口:(这是SSH端口,所以协议换成了https协议)
点击“高级”,然后继续前往即可。
也可以出现tomcat首页。
3、安装cas 5.3
修改pom.xml文件,将cas.version改为5.3.0:(其实也可以改为别的5版本)
做mvn install(如果编译出了问题,可以先做mvn clean,再做mvn install)
耐心等待下载和编译完毕:
。。
编译成功了,在target目录下生成了一个cas.war文件,将war包拷贝到tomcat的webapps下:
看tomcat的日志catalina.out,说明CAS已经启动:
用浏览器打开 https://192.168.40.133:8443/cas/login 。
输入CAS Sever缺省的用户名密码:casuser/Mellon:
点击登录按钮:
可见CAS 5.3的服务器已经成功搭建。
4、让cas 5.3使用MySQL存储用户名和密码
如果要调整CAS的密码机制为读取数据库,还是需要安装MySQL,并且配置cas server的数据库配置。
MySQL安装
apt-get install mysql-server
mysql_secure_installation
检查mysql状态
如果要允许root远程登录(不推荐),还需要完成以下操作:
mysql -u root -p
编辑/etc/mysql/my.cnf
让CAS增加数据库配置:
建立dep目录并编辑pom.xml文件:
执行 mvn -f pom.xml dependency:copy-dependencies 下载数据库链接的依赖包
。。。
将编译好的jar包拷贝到tomcat webapps下的cas/WEB-INF/lib目录下
修改 /home/cas/cas5.3/apache-tomcat-8.5.31/webapps/cas/WEB-INF/classes/application.properties文件,在最后一段认证配置中做以下修改:
##
# CAS Authentication Credentials
#
#cas.authn.accept.users=casuser::Mellon
#配置数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/casdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库密码
cas.authn.jdbc.query[0].password=mysql
#mysql驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#添加jdbc认证
cas.authn.jdbc.query[0].sql=SELECT * FROM login WHERE login_name =?
#哪个字段作为密码字段
cas.authn.jdbc.query[0].fieldPassword=login_password
#哪个字段作为过期字段 0:未过期 1:已过期
cas.authn.jdbc.query[0].fieldExpired=expired
#哪个字段作为是否可用字段 0:未禁用 1:已禁用
cas.authn.jdbc.query[0].fieldDisabled=disabled
#配置加密策略
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
请注意mysql连接串如果不加
serverTimezone=UTC
可能会报错。
在mysql建个casdb数据库
create database casdb;
并建立ogin表:
插入2条数据:
重启tomcat
再重新打开页面: https://192.168.40.133:8443/cas/login
输入:test 密码:123456 (普通md5)可以正常登录。
从后台日志也可以看出:CAS验证成功并发了ticket。
用户密码的密文生成:
大家肯定有疑问,login表中login_password密码字段的那串密文是怎么得来的呢?张小白介绍一下:
建一个Maven工程,用来生成加密盐的密码:
把计算出的结果更新mysql数据库的login表:
再在/home/cas/cas5.3/apache-tomcat-8.5.31/webapps/cas/WEB-INF/classes/application.properties 中增加第二种认证策略,策略中的Salt、加密算法等保证跟前面计算密码密文的一致。
#数据库连接
cas.authn.jdbc.encode[0].driverClass=com.mysql.cj.jdbc.Driver
cas.authn.jdbc.encode[0].url=jdbc:mysql://127.0.0.1:3306/casdb?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.encode[0].user=root
cas.authn.jdbc.encode[0].password=mysql
#加密迭代次数
cas.authn.jdbc.encode[0].numberOfIterations=2
#该列名的值可替代上面的值,但对密码加密时必须取该值进行处理
cas.authn.jdbc.encode[0].numberOfIterationsFieldName=
#动态盐值用的字段
cas.authn.jdbc.encode[0].saltFieldName=login_name
#静态盐值
cas.authn.jdbc.encode[0].staticSalt=654321
cas.authn.jdbc.encode[0].sql=SELECT * FROM login WHERE login_name =?
#对处理盐值后的算法
cas.authn.jdbc.encode[0].algorithmName=MD5
#哪个字段作为密码字段
cas.authn.jdbc.encode[0].passwordFieldName=login_password
#哪个字段作为过期字段 0:未过期 1:已过期
cas.authn.jdbc.encode[0].expiredFieldName=expired
#哪个字段作为是否可用字段 0:未禁用 1:已禁用
cas.authn.jdbc.encode[0].disabledFieldName=disabled
再重启tomcat
打开页面https://192.168.40.133:8443/cas/login ,
输入 用户名admin ,密码123456登录
终于也可以成功登录了。
看一下后台日志catalina.out,确实是admin用户成功登陆了。
从上面可以看出,尽管2个用户的密码都是123456,但是一个是简单的MD5加密,一个是加了盐的MD5加密,所以密文是不一样的。
当然,如果在浏览器输入:https://192.168.40.133:8443/cas/logout
可以把登录的用户注销。
后台日志也显示这个ticket被销毁了:
至此,CAS Server总算搭建完成了。
当然,CAS Server需要CAS Client的配合才能完整使用。这点张小白还在尝试之中。本文暂时不谈CAS Client的问题。有兴趣的人可以看下张小白读书笔记的最后一段内容研究下。
参考资料:
1.单点登录(SSO)看这一篇就够了 https://www.jianshu.com/p/75edcc05acfd
2.关于JSESSIONID https://www.jianshu.com/p/f2e5db637ed4
3.Spring Security基于JWT实现SSO单点登录 https://blog.csdn.net/qq_36144258/article/details/79425942
4.CAS-搭建CAS Server服务端(静态认证) https://my.oschina.net/u/4335103/blog/4535512
5. CAS server6.x配置与部署笔记 https://blog.csdn.net/hy9418/article/details/107104177/
6. CAS单点登录学习笔记--CAS Server搭建(一)https://blog.csdn.net/polo_longsan/article/details/91391272
7. 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER 服务端 https://blog.csdn.net/weixin_39206782/article/details/80659033
8. CAS5.3单点登录(一)服务器搭建 https://blog.csdn.net/zzy730913/article/details/80796716
9. CentOS安装CAS 5.3.4服务端 https://www.cnblogs.com/kgdxpr/p/9854657.html
10. 终于把单点登录完整流程图画明白了!史上最完整的CAS单点登录完整图解!https://blog.csdn.net/A_art_xiang/article/details/107028456
(全文完,谢谢阅读)
- 点赞
- 收藏
- 关注作者
评论(0)