ubuntu 18.04安装CAS 5.3全记录

举报
张辉 发表于 2021/04/05 22:51:09 2021/04/05
【摘要】 本文介绍了CAS 5.3在ubuntu 18.04上的安装过程。

注:本文初次发布于 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的流程如下:

  1. 用户访问CAS Client的某个页面,如app1.my.com/hello
  2. CAS Client判断用户没有登录,会返回302状态码,指示浏览器重定向 如http://sso.my.com?service=app1.my.com/hello.在这里,service赋值为第一步的原访问地址。
  3. 浏览器携带service重定向到CAS Server。
  4. CAS Server获取Cookie中的的TGC,并以此查找TGT。如果找到,则认证完成。否则,会重定向到CAS Server的登录页面,如http://sso.my.com/login?service=app1.my.com/hello
  5. 用户在登录页面录入用户名,密码,点击登录。首次登录,CAS Server会生成TGT。每次验证时,CAS Server会根据TGT签发一个ST。将ST拼接在service中,并将TGC设置到用户Cookie中(域为sso.my.com)。并返回302状态码,指示浏览器重定向:http://app1.my.com/hello?ticket=xxx
  6. 浏览器将TGC写入的Cookie,并携带ticket(即ST)重定向到service即app1.my.com/hello的原业务页面。
  7. app1(CAS Client)拿到ticket,向CAS Server验证ticket的有效性
  8. 如果CAS Server验证是有效的,会告知CAS Client该ticket有效,并返回用户信息。
  9. app1将登录状态写入session,设置app1.my.com域下的cookie。

此时,如果用户访问另一个系统 app2.my.com,流程如下:

  1. 用户访问CAS Client的某个页面,如app2.my.com/hello
  2. CAS Client判断用户没有登录,会返回302状态码,指示浏览器重定向 如http://sso.my.com?service=app2.my.com/hello,在这里,service赋值为第一步的原访问地址。
  3. 浏览器携带service重定向到CAS Server。
  4. CAS Server获取Cookie中的的TGC,并以此查找TGT。此时因为用户在浏览器登录过,所以已经找到了。CAS Server会根据TGT签发一个ST,将ST拼接在service中,并返回302状态码,指示浏览器重定向:http://app2.my.com/hello?ticket=xxx
  5. 浏览器并携带ticket(即ST)重定向到service即app2.my.com/hello的原业务页面。
  6. app2(CAS Client)拿到ticket,向CAS Server验证ticket的有效性
  7. 如果CAS Server验证是有效的,会告知CAS Client该ticket有效,并返回用户信息。
  8. 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 网页,

image.png

点击Download,会进入 https://github.com/apereo/cas 页面:

众所周知,这个页面很难打开。

我们需要利用 http://ipaddress.com 

image.png

将github.com加入 C:\Windows\System32\drivers\etc\HOSTS 文件

image.png


再刷新DNS缓存:

image.png

再次打开github页面:

image.png

我们可以从官网下载相关的软件包,也可以自行准备,包含以下:

  • 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的目录(目的可以自行调整)

image.png

编辑/etc/profile,并source使其生效:

image.png

可检查解压后的java和mvn版本:

image.png

2.tomcat启动与处理

先裸启tomcat

image.png

浏览器访问tomcat:

image.png

好像启动没啥问题。

下面开始制作tomcat的证书,以便使tomcat支持https访问。

生成server.keystore

keytool -genkey -alias tomcat -keyalg RSA -keypass tomcat -storepass tomcat -keystore server.keystore -validity 3600

image.png

这里面请注意一个细节,在系统询问“What is your first and last name?”的时候,记得这时输入CAS服务器的域名,也就是你规划好的SSO服务器的域名。否则,在CAS客户端连接后会报错。

生成证书

keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass tomcat

image.png导入证书:

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

image.png修改tomcat的配置文件server.xml(注意看截图中的路径)

image.png

找到 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

image.png

image.png

再打开 https://192.168.40.133:8443/ 端口:(这是SSH端口,所以协议换成了https协议)

image.png

点击“高级”,然后继续前往即可。

image.png

也可以出现tomcat首页。


3、安装cas 5.3

修改pom.xml文件,将cas.version改为5.3.0:(其实也可以改为别的5版本)

image.png

做mvn install(如果编译出了问题,可以先做mvn clean,再做mvn install)

image.png

耐心等待下载和编译完毕:

image.png

。。

image.png

编译成功了,在target目录下生成了一个cas.war文件,将war包拷贝到tomcat的webapps下:

image.png

看tomcat的日志catalina.out,说明CAS已经启动:

image.png

用浏览器打开 https://192.168.40.133:8443/cas/login

image.png

输入CAS Sever缺省的用户名密码:casuser/Mellon:

image.png

点击登录按钮:

image.png

可见CAS 5.3的服务器已经成功搭建。

4、让cas 5.3使用MySQL存储用户名和密码

如果要调整CAS的密码机制为读取数据库,还是需要安装MySQL,并且配置cas server的数据库配置。

MySQL安装

apt-get install mysql-server

image.png

image.png

mysql_secure_installation

image.png

检查mysql状态

image.png

如果要允许root远程登录(不推荐),还需要完成以下操作:

mysql -u root -p

image.png

image.png

编辑/etc/mysql/my.cnf

image.png

让CAS增加数据库配置:

建立dep目录并编辑pom.xml文件:

image.png

执行 mvn -f pom.xml dependency:copy-dependencies 下载数据库链接的依赖包

image.png

。。。

image.png

将编译好的jar包拷贝到tomcat webapps下的cas/WEB-INF/lib目录下

image.png

修改 /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表:

image.png

插入2条数据:

image.png

重启tomcat

image.png

再重新打开页面: https://192.168.40.133:8443/cas/login

输入:test   密码:123456   (普通md5)可以正常登录。

image.png

从后台日志也可以看出:CAS验证成功并发了ticket。

image.png

用户密码的密文生成:

大家肯定有疑问,login表中login_password密码字段的那串密文是怎么得来的呢?张小白介绍一下:

建一个Maven工程,用来生成加密盐的密码:

image.png

把计算出的结果更新mysql数据库的login表:

image.png


再在/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登录

image.png

终于也可以成功登录了。

看一下后台日志catalina.out,确实是admin用户成功登陆了。

image.png

从上面可以看出,尽管2个用户的密码都是123456,但是一个是简单的MD5加密,一个是加了盐的MD5加密,所以密文是不一样的。

当然,如果在浏览器输入:https://192.168.40.133:8443/cas/logout 

image.png

可以把登录的用户注销。

后台日志也显示这个ticket被销毁了:

image.png

至此,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 

 (全文完,谢谢阅读)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。