在公司里,一旦有多个系统时,单点登录(Single Sign On)几乎是必须的,可以使用统一鉴权中心CAS,它是开源免费的项目,运行前最好先配置https,建议在centos7中配置。
CAS(Central Authentication Service)是 Yale大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法。
5.0版本之后的最大改变就是引入了流行的微服务架构spring boot,他将之前使用bean注入的换成了spring boot的配置,以及增加了容器(docker)
环境
- CAS-5.3.2
- tomcat8.5
- jdk8
- centos 7
安装完centos7,先关闭防火墙和SELINUX.
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
sestatus 查看SELINUX
vi /etc/selinux/config
把SELINUX=enforcing 改成 SELINUX=disabled
然后重启系统。
配置tomcat+https
1、生成服务器的密匙文件tomcat.keystore
keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -validity 36500 -keystore /usr/local/certificate/tomcat.keystore
参数说明
- -genkey 生成密钥
- -keyalg 指定密钥算法,这时指定RSA,
- -keysize 指定密钥长度,默认是1024位,这里指定2048,长一点,比较难破解,
- -validity 指定证书有效期,这里指定36500天,我想我的应用用不到那么长时间
- -alias 指定别名,这里是tomcat
- -keystore 指定密钥库存储位置,这里存在/usr/local/certificate/目录下
注意:您的名字与姓氏www.jacky.sso.com是CAS服务器使用的域名,不是随便乱定的,其他的随意
2、导出证书
[root@localhost certificate]# keytool -export -alias tomcat -storepass 123456 -file tomcat.cer -keystore tomcat.keystore
Certificate stored in file
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore tomcat.keystore -destkeystore tomcat.keystore -deststoretype pkcs12".
[root@localhost certificate]# ls
然后发现certificate目录下多了一个tomcat.cer的文件,表示导出证书成功
参数说明
- -alias指定别名为tomcat;
- -storepass指定私钥为123456;
- -file指定导出证书的文件名为tomcat.cer;
- -keystore指定之前生成的密钥文件的文件名。
注意:-alias和-storepass必须为生成tomcatekeystore密钥文件时所指定的别名和密码,否则证书导出失败
3、导入证书导入到jdk信任库
[root@localhost certificate]# keytool -import -alias tomcat -keystore $JAVA_HOME/jre/lib/security/cacerts -file /usr/local/certificate/tomcat.cer -trustcacerts
Enter keystore password:
Re-enter new password:
Owner: CN=www.jacky.sso.com, OU=jacky, O=jacky, L=wh, ST=wh, C=zh
Issuer: CN=www.jacky.sso.com, OU=jacky, O=jacky, L=wh, ST=wh, C=zh
Serial number: 70743990
Valid from: Sun Dec 09 09:41:20 EST 2018 until: Tue Nov 15 09:41:20 EST 2118
Certificate fingerprints:
MD5: A1:4A:E6:71:01:2A:C2:9B:92:AC:67:A1:DA:30:30:E3
SHA1: 6A:DF:27:DE:35:D9:23:F7:2D:43:5A:34:0C:89:B3:42:60:72:A5:94
SHA256: EE:0C:9D:FC:65:8B:12:36:AB:C8:96:59:27:C1:62:29:A3:B8:19:30:99:39:6B:F3:68:B6:3A:09:C7:1E:9E:9A
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 90 39 EF 31 29 0D CF 1B 0B 3A 00 EE 14 88 52 B2 .9.1)....:....R.
0010: 9B 5A 5F F3 .Z_.
]
]
Trust this certificate? [no]: y
Certificate was added to keystore
注意:原来的$JAVA_HOME/jre/lib/security/cacerts文件要先删掉,否则会报出java.io.IOException: Keystore was tampered with, or password was incorrect错误
4、服务端tomcat配置
打开$CATALINA_HOME/conf/server.xml,增加
port一般为8443或443,最常用的是443端口(https默认端口),
这样https方式访问的时候可以不加端口号(如:https://jacky.sso/cas/login);
keystoreFile为tomcat目录下的密钥文件;
keystorePass为私钥密码;truststoreFile为生成的信任文件,
查看证书,输入123456
keytool -list -keystore cacerts -alias tomcat
输入密钥库口令:
tomcat, 2018-12-10, trustedCertEntry,
证书指纹 (SHA1): 6A:DF:27:DE:35:D9:23:F7:2D:43:5A:34:0C:89:B3:42:60:72:A5:94
删除证书
keytool -delete -keystore jre/lib/security/cacerts -alias tomcat
5、生成客户端密钥库文件
单向认证的客户端配置只需生成客户端信任文件caserts即可。
首先将服务端生成的证书文件(之前生成的casserver.cer文件)复制到$JAVA_HOME/jre/lib/security
下,然后打开cmd窗口切换到$JAVA_HOME/jre/lib/security
下并执行命令:
keytool -import -trustcacerts -alias tomcat -storepass 123456 -file tomcat.cer -keystore cacerts
命令执行成功后JDK目录/jre/lib/security下多出cacerts文件。
注意,jdk目录中有jre和jdk/jre2个jre目录,要确认client使用哪一个或2个都加上。
6、在hosts文件中增加下面映射
192.168.0.116 www.jacky.sso.com
7、验证https配置
输入:https://www.jacky.sso.com:8443
说明配置成功
模板cas-overlay-template
为什么要使用cas-overlay呢?cas工程中模块有很多,是用gradle编译的,好多模块是我们不需要的,若是全编译会很麻烦。还好看了cas的官方说明文档,发现官方提供了一个无侵入式的一套来设计cas,所谓的无侵入式就是你直接打成war包,放到tomcat里面运行,你能运行,你也可以自己建立相应的文件(把application.properties复制到src/main/resource中编辑再打包),cas这套他能将你的覆盖掉他原有的(名字路径相同)。通过这样来达到改变代码以及其他东西来完成cas服务器的搭建。
下载cas-gradle-overlay-template
打包方式:
- 在centos下,运行
./build.sh package
,完成后在cas/build目录下 - 导入idea,在gradle的任务栏中双击
build
将生成的war文件复制到tomcat/webapps下,启动tomcat,则会看到CAS的启动日志。
输入:https://www.jacky.sso.com:8443/cas/login
查看cas系统
或 http://www.jacky.sso.com:8080/cas/login
这样会提示不安全的连接
登录用户名和密码可以输入casuser和Mellon,这是初始配置文件默认的,文件位于apache-tomcat\webapps\cas\WEB-INF\classes下的application.properties
CAS原理
CAS的原理稍稍有些复杂,我们至少要了解TGT、TGC、ST这个三个核心概念,以及整个单点登录的实现过程。强烈推荐博文《前端需要了解的 SSO 与 CAS 知识》,建议大家务必提前细细品味,钻研透彻,否则后续的实现过程会让你觉得云里雾里。
了解了CAS的原理后,还需要注意一点,CAS默认是基于浏览器的单点登录方式,其依赖于浏览器的cookie和重定向机制。但是,由于移动互联网的发展,客户端的接入方式已经不限于浏览器,我们更多的需要支持原生应用(如安卓、IOS)的接入。因此,CAS的基于cookie和重定向机制的浏览器登录认证方式有了很大的局限性。另外,当下前后端分离的开发形式已非常广泛,前后端之间都通过REST接口进行请求。
基于上面的因素,CAS又单独提供了REST的扩展。本系列对两种方式(浏览器方式、REST方式)的实现都会进行介绍。
数据库安装
centos7中安装mysql,默认(yum -y install mysql)是安装MariaDB,若想安装mysql,如下:
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# yum install mysql-community-server
安装成功后重启mysql服务。
service mysqld restart
初次安装mysql,root账户没有密码。
[root@yl-web yl]# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.26 MySQL Community Server (GPL)
mysql> show databases;
设置密码
mysql> set password for 'root'@'localhost' =password('password');
Query OK, 0 rows affected (0.00 sec)
编码
mysql配置文件为/etc/my.cnf
最后加上编码配置
[mysql]
default-character-set =utf8
远程连接配置
把在所有数据库的所有表的所有权限赋值给位于所有IP地址的root用户。
mysql> grant all privileges on *.* to root@'%'identified by 'password';
如果是新用户而不是root,则要先新建用户
mysql>create user 'username'@'%' identified by 'password';
CAS数据库认证配置
cas默认只是配置的简单的登录用户,实际使用中不可能只有一个用户,所以需要配置数据库,这里配置mysql.
cas不管数据表的设计,你只需要把sql、密码字段及相关信息配置好即可。
cas包含众多功能推荐server使用一体化版本的overlay,按官网说法按需导入依赖即可,如cas-overlay-template中,可以把build的war文件解压,将application.properties文件复制到cas/src/main/resources目录中,如下图
这样就可以直接修改application.properties文件并打包了。
添加jdbc连接依赖
在cas/build.gradle中添加需要的依赖,如数据库,如下图
添加mysql配置
先注释掉cas默认的认证方式,然后在下面添加数据库的配置信息,如下:
##
# CAS Authentication Credentials
#
#cas.authn.accept.users=casuser::Mellon
# db
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=root
cas.authn.jdbc.query[0].sql=select password from t_user where account=? and status = 'active'
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
cas.authn.jdbc.query[0].idleTimeout=5000
# for md5
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
若不需要md5摘要,可以移除,这样就是非加密方式登录了。
修改完成后,重新打包,生成war文件,解压war文件,发现application.properties文件已更新,同时lib目录中也多了mysql的依赖包。
重启服务,直接登录即可。