Cas 5.2.x版本单点登录服务安装 —— SpringBoot内部运行(一)

由于工作上的需求以及个人的兴趣,最近在研究CAS单点登录,为了记录学习的一些过程,以便后面翻阅也一同给大家分享一下。

我的环境

  • CAS-server:5.2.2

  • Maven:3.5.2

  • JDK:1.8

  • cas-server域名:cas.server.com

  • tomcat服务器:我用的SpringBoot插件

  • 操作系统:MacOS

一、什么是CAS?什么是单点登录?

CAS是一个单点登录框架,开始是由耶鲁大学的一个组织开发,后来归到apereo去管。 

同时CAS也是开源,遵循着apache 2.0协议,代码目前是在github上管理。

单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

通俗理解为一个应用登录了,其他被授权的应用不用再登录。应用例子为:淘宝登录了天猫不用再登录。

二、应用场景

  • 分布式多系统用户集中管理

  • 用户权限集中管理

  • 多因素认证(如微信pc端登录手机确认)

如公司有多个系统,分别OA系统、CRM系统、财务管理系统、设备管理系统等,总不能访问每个系统都要登录一遍吧,用户会疯掉的,应该我们认证一遍,其他系统即可访问。

三、下载与构建

Cas支持Gradle和Maven两种方式部署,使用SpringBoot构建

下载

Maven地址:https://github.com/apereo/cas-overlay-template

Gradle地址:https://github.com/apereo/cas-gradle-overlay-template

构建

将下载Overlay解压,默认配置就可以直接构筑能用的war 包,在Mac中使用 build.sh package(这个 war 包可以直接放在配置好httpsTomcat 8+版本中运行,下一篇文章介绍。)

WX20180416-150130@2x.png

四、配置Hosts文件

配置本地hosts文件

127.0.0.1    cas.server.com

五、证书生成

创建一个cas目录,cd进入cas目录之后执行如下命令。

注意要点

  • 名字和姓氏输入项:访问的域名地址

  • alias:别名可以随便写,一般要有意义,后续操作别名要一致,我这里保持和域名统一了

1、使用java自带keytool创建本地密钥库

密码:changeit

别名:cas.server.com

语法:keytool -genkey -alias cas.server.com -keyalg RSA -keystore casServer.keystore

➜  cas keytool -genkey -alias cas.server.com -keyalg RSA -keystore casServer.keystore
输入密钥库口令:  
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  cas.server.com
您的组织单位名称是什么?
  [Unknown]:  wusong
您的组织名称是什么?
  [Unknown]:  yanfazu
您所在的城市或区域名称是什么?
  [Unknown]:  beijing
您所在的省/市/自治区名称是什么?
  [Unknown]:  dongcheng
该单位的双字母国家/地区代码是什么?
  [Unknown]:  zh
CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh是否正确?
  [否]:  y
输入 <cas.server.com> 的密钥口令
(如果和密钥库口令相同, 按回车):  
再次输入新口令:
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore casServer.keystore -destkeystore casServer.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

2、把密钥库导出成证书文件

语法: keytool -export -alias cas.server.com -keystore casServer.keystore -file casServer.crt -storepass changeit

➜  cas keytool -export -alias cas.server.com -keystore casServer.keystore -file casServer.crt -storepass changeit
存储在文件 <casServer.crt> 中的证书
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore casServer.keystore -destkeystore casServer.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

3、查看证书

语法:keytool -printcert -file casServer.crt

➜  cas keytool -printcert -file casServer.crt
所有者: CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh
发布者: CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh
序列号: 1e2220da
有效期为 Thu Mar 08 15:46:33 CST 2018 至 Wed Jun 06 15:46:33 CST 2018
证书指纹:
     MD5:  XXXXXXXXXXXXXXXXXX
     SHA1: XXXXXXXXXXXXXXXXXX
     SHA256: XXXXXXXXXXXXXXXXXX
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: AE C3 88 BB 9B 2B 44 6E   BC B1 EB 57 82 24 62 6A  .....+Dn...W.$bj
0010: CC F6 31 CF                                        ..1.
]
]

4、将创建过的证书导入到java证书库

语法: sudo keytool -import -keystore "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/cacerts" -file "/Users/liurenkui/Desktop/cas/casServer.crt" -alias cas.server.com

这里建议把进入caserts目录再操作,不然容易出现如下错误,大概是无法识别,另外需要加上root权限。

keytool 错误: java.io.FileNotFoundException: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/security/cacerts (No such file or directory)

实例

➜  security sudo keytool -import -keystore cacerts -file "/Users/liurenkui/Desktop/cas/casServer.crt" -alias cas.server.com
Password:
输入密钥库口令:  
所有者: CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh
发布者: CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh
序列号: 1e2220da
有效期为 Thu Mar 08 15:46:33 CST 2018 至 Wed Jun 06 15:46:33 CST 2018
证书指纹:
 MD5:  XXXXXXXXXXXXXXXXXX
 SHA1: XXXXXXXXXXXXXXXXXX
 SHA256: XXXXXXXXXXXXXXXXXX
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: AE C3 88 BB 9B 2B 44 6E   BC B1 EB 57 82 24 62 6A  .....+Dn...W.$bj
0010: CC F6 31 CF                                        ..1.
]
]
是否信任此证书? [否]:  y
证书已添加到密钥库中
➜  security

5. 查看JDK证书内容

语法:keytool -list -v -keystore cacerts -alias cas.server.com

导入成功之后,jdk证书文件会有对应的如下内容

➜  security keytool -list -v -keystore cacerts -alias cas.server.com
输入密钥库口令:  
别名: cas.server.com
创建日期: 2018-3-8
条目类型: trustedCertEntry
所有者: CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh
发布者: CN=cas.server.com, OU=wusong, O=yanfazu, L=beijing, ST=dongcheng, C=zh
序列号: 1e2220da
有效期为 Thu Mar 08 15:46:33 CST 2018 至 Wed Jun 06 15:46:33 CST 2018
证书指纹:
 MD5:  XXXXXXXXXXXXXXXXXX
 SHA1: XXXXXXXXXXXXXXXXXX
 SHA256: XXXXXXXXXXXXXXXXXX
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: AE C3 88 BB 9B 2B 44 6E   BC B1 EB 57 82 24 62 6A  .....+Dn...W.$bj
0010: CC F6 31 CF                                        ..1.
]
]
➜  security

6. 根据 alias 别名删除 JDK 证书

语法:sudo keytool -delete -alias cas.server.com -keystore cacerts

➜  security sudo keytool -delete -alias cas.server.com -keystore cacerts
Password:
输入密钥库口令:

五、使用Idea工具打开overlay,修改配置

1、pom.xml文件

有可能你的pom.xml文件中有两处报错(如下图)。因为网络原因需要的插件不能下载下来,我的处理办法是直接删除了,我本地有maven环境,所以无妨。另外也可以选择将pom.xml文件中的仓库,修改为阿里的镜像仓库,速度应该会好很多。

如果是war包下载不下来,可自行下载war加载:https://oss.sonatype.org/content/repositories/releases/org/apereo/cas/

执行chmod +x *.sh 或者执行chmod 777 *.sh

2、cas.properties文件

1、将上面创建的证书文件 casServer.crt、casServer.keystore 拷贝到cas目录中

2、证书配置到cas.properties文件中,内容如下

cas.server.name: https://cas.example.com:8443
cas.server.prefix: https://cas.example.com:8443/cas

cas.adminPagesSecurity.ip=127\.0\.0\.1

logging.config: file:/etc/cas/config/log4j2.xml
# cas.serviceRegistry.config.location: classpath:/services

server.ssl.keyStore=file:/etc/cas/casServer.keystore
server.ssl.keyStorePassword=changeit
server.ssl.keyPassword=changeit
server.ssl.key-alias=cas.server.com
配置说明
server.context-path=/表示的是直接通过ip就可以访问到项目,不需要加项目名称
server.port=9000springboot项目的访问端口号
server.ssl.enabled=true开启证书,https
server.ssl.key-store=classpath:tomcat.keystore证书目录,放在classpath目录了
server.ssl.key-store-password=yellowcong证书的密码
server.ssl.keyAlias=tomcat证书的别名,需要命令查看
cas.authn.accept.users=yellowcong::yellowcong静态登录的用户名和密码

3、log4j2.xml 日志文件

1、在cas-overlay-template-master项目中,创建一个logs目录,用于存放日志文件,默认cas在项目根目录下生成日志,日志多了不方便管理,修改log4j2.xml文件,将日志目录做调整

2、比如将fileName="${sys:cas.log.dir}/cas.log" 修改为 fileName="${sys:cas.log.dir}/logs/cas.log"

4、权限

MacOS系统中权限一般很重要,为了方便,我将 cas-overlay-template-master 和 /ets/cas 两个目录设置成了当前用户完全控制,这样就不用频繁使用sudo命令了。

cas在启动和构建时,会自动将项目的 etc/cas 文件夹拷贝到系统的 etc/cas 中,这也是需要权限的。

5、目录结构

最后的目录结构如图

WX20180416-155710@2x.png

六、运行测试

Idea工具中,Terminal窗口中,输入运行 build.sh run 命令启动Cas

WX20180416-160228@2x.png

运行窗口会打印CAS、STOP等字样,这表示cas在运行检查机制,查看一些签名,jdbc链接等策略,没有的话自动生成,这是正常情况。如果这些我们都配置了,那么也就不会自动生成量

WX20180416-160644@2x.png

访问地址:https://cas.server.com:8443/cas

默认账号:`casuser`默认密码:`Mellon` 

目前的配置仅有这一个用户

登录成功页面

登出页面

七、常见问题

jar包导入问题,这个问题可能是由于国内网络的问题导致的,所以解决的方案有两种: 

1、可以使用阿里云镜像仓库 

2、可以在cas的管网下载需要好的jar或war包后,导入到本地的maven仓库中。

八、我的源码

https://github.com/X-rapido/CAS_SSO_Record

九、参考文档

https://apereo.github.io/cas/development/installation/Maven-Overlay-Installation.html

SSL证书生成:https://github.com/X-rapido/CAS_SSO_Record/blob/master/SSL证书生成.md

build.sh 文件介绍:https://github.com/X-rapido/CAS_SSO_Record/blob/master/build.sh%20文件介绍.md

未经允许请勿转载:程序喵 » Cas 5.2.x版本单点登录服务安装 —— SpringBoot内部运行(一)

点  赞 (5) 打  赏
分享到: