美文网首页java高级开发
CAS单点登录--Server

CAS单点登录--Server

作者: 老鼠AI大米_Java全栈 | 来源:发表于2018-12-12 14:37 被阅读31次

    在公司里,一旦有多个系统时,单点登录(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/目录下
      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 <tomcat.cer>
    
    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,增加

    <Connector protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    keystoreFile="/usr/local/certificate/tomcat.keystore" 
    keystorePass="123456" port="8443" />
    

    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

    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.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目录中,如下图


    image.png

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

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

    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

        本文链接:https://www.haomeiwen.com/subject/fdolhqtx.html