ubuntu 18.04安装CAS 5.3全记录

网友投稿 909 2022-05-30

注:本文初次发布于 https://bbs.huaweicloud.com/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的那段代码,做如下修改:

重启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

ubuntu 18.04安装CAS 5.3全记录

可以把登录的用户注销。

后台日志也显示这个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

(全文完,谢谢阅读)

https Spring Boot Tomcat Ubuntu 软件安全

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Excel表格中三维饼图有哪些制作方法
下一篇:普惠AI,让智能无所不及
相关文章