CAS单点登录--Server

在公司里,一旦有多个系统时,单点登录(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/目录下
    CAS单点登录--Server_第1张图片
    https1.png

    注意:您的名字与姓氏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单点登录--Server_第2张图片
https2.png

说明配置成功

模板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 这样会提示不安全的连接

CAS单点登录--Server_第3张图片
cas.png

登录用户名和密码可以输入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目录中,如下图


CAS单点登录--Server_第4张图片
image.png

这样就可以直接修改application.properties文件并打包了。

添加jdbc连接依赖
在cas/build.gradle中添加需要的依赖,如数据库,如下图

CAS单点登录--Server_第5张图片
image.png

添加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的依赖包。

重启服务,直接登录即可。

你可能感兴趣的:(CAS单点登录--Server)