CAS环境搭建-证书方式(https连接)
一、教程前言
1 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤
2 单点登录(SSO):请看《CAS简介》
3 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server),
4 官网:http://www.jasig.org/cas
5 本教程环境:
.Tomcat7.0.35
.JDK8
.CAS Server版本:cas-server-4.0.0-release
.CAS Client版本:cas-client-core-3.4.1-release
二、创建证书
证书是单点登录认证系统中很重要的一把钥匙,客户端于服务器的交互安全靠的就是证书;本教程由于是演示所以就自己用JDK自带的keytool工具生成证书;如果以后真正在产品环境中使用肯定要去证书提供商去购买,证书认证一般都是由VeriSign认证,
中文官方网站:http://www.verisign.com/cn/
用JDK自带的keytool工具生成证书:
keytool -genkey -alias shaw -keyalg RSA -keystore d:/keys/shawKey
命令说明里头的shaw 和shawKey是自己定义的名字,当然你也可以修改。
在输入完密码后提示输入域名是我输入的是sso.shaw.com,其实这个域名是不存在的,但是我为了演示所以虚拟了这个域名,技巧在于修改C:\Windows\System32\drivers\etc\hosts,添加内容如下:
127.0.0.1 sso.shaw.com
这样在访问sso.shaw.com的时候其实是访问的127.0.0.1也就是本机
严重提醒:提示输入域名的时候不能输入IP地址
三、导出证书
命令:D:\keys>keytool -export -file d:/keys/shaw.crt -alias shaw -keystore d:/keys/shawkey
备注:里头的shaw都可以换成你自己想要的名称,当然要和之前生成的key一致。密码是刚才生成设置的密码。
至此导出证书完成,可以分发给应用的JDK使用了,接下来讲解客户端的JVM怎么导入证书。
生成证书碰到报错可以参考一下内容:
原因:JDK路径带有空格,在路径上加上双引号即可,如下:
四、为客户端的JVM导入证书
命令:keytool -import -keystore D:/softWare/Java/jdk1.8.0_91/jre/lib/security/cacerts -file D:/keys/shaw.crt -alias shaw
为客户端JVM导入证书,特别说明:D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security — 是jre的目录;密码还是刚刚设置的密码。至此证书的创建、导出、导入到客户端JVM都已完成,下面开始使用证书到Web服务器中,本教程使用tomcat。
有可能会碰到报错请参考:
keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect
这里需要输入的密码不是证书的密码执行keytool -import -keystore - file 这个命令提示需要输入密码。输入 changeit,信任证书,OK
五、应用证书到Web服务器-Tomcat
说是应用起始做的事情就是启用Web服务器(Tomcat)的SSL,也就是HTTPS加密协议,准备好一个干净的tomcat,本教程使用的apache-tomcat-7.0.75,打开tomcat目录的conf/server.xml文件,开启87和92行的注释代码,并设置keystoreFile、keystorePass修改结果如下
<Connector port="" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:/keys/shawkey"
keystorePass=""
/>
参数说明:
浏览器提示证书错误,好的,那么我们点击“继续浏览此网站(不推荐)。 ”,现在进入Tomcat目录了吧,如果是那么你又向成功迈进了一步。OK,接下来要配置CAS服务器了。
六、CAS服务器初体验
1.CAS服务端下载:http://www.jasig.org/cas/download
2.下载完成后将cas-server-4.0.0-release.zip解压,解压cas-server-4.0.0-release/modules/cas-server-webapp-4.0.0.war,然后复制到你的tomcat/webapp目录下
3.现在可以访问CAS应用了,当然要使用HTTPS加密协议访问,
例如本教程地址:https://sso.shaw.com:8443/cas-server-webapp-4.0.0/login ,现在打开了CAS服务器的页面输入 默认是 casuser/Mellon点击登录,所以如果你看到下面的这张图片你就成功。
CAS登录成功,你成功了吗?如果没有成功请再检查以上步骤!
七、CAS服务器深入配置
上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。
首先打开tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml文件,配置的地方如下,找到第107行处,注释掉:
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用!在下面添加下面的代码:
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select password from t_admin_user where login_name=?" />
<property name="passwordEncoder" ref="MD5PasswordEncoder"/>
</bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://127.0.0.1:3306/user_tb</value></property>
<property name="username"><value>root</value></property>
<property name="password"><value></value></property>
</bean> <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<constructor-arg index="">
<value>MD5</value>
</constructor-arg>
</bean>
复制cas-server-4.0.0\modules\cas-server-support-jdbc-4.0.0.jar和mysql驱动jar包到tomcat/webapp/cas/WEB-INF/lib目录
配置解释:
QueryDatabaseAuthenticationHandler是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticationHandler是通过配置一个 SQL 语句查出密码,与所给密码匹配
dataSource我就不用解释了吧,就是使用JDBC查询时的数据源
sql语句就是查询哪一张表,本例根据t_admin_user表的login_name字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是t_admin_user的表结构:
CREATE TABLE t_admin_user (
id BIGINT NOT NULL AUTO_INCREMENT,
email VARCHAR(),
login_name VARCHAR() NOT NULL UNIQUE,
name VARCHAR(),
password VARCHAR(),
PRIMARY KEY (id)
) ENGINE=InnoDB;
passwordEncoder,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可。
我自己新增了一个用户,然后在线md5生成了一个密码为1的password。
复制配置过程中有可能会出现这样问题:
cvc-complex-type.2.3: 元素 'beans' 必须不含字符 [子级], 因为该类型的内容类型为“仅元素”
解决方案:
打开一个记事本,命令行notepad,然后把配置复制进去,去掉多余的空格,重新回车,黏贴回去,就好了。
八、配置CAS客户端
添加cas-client的jar包,有两种方式:
传统型:下载cas-client,地址:http://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core/3.4.1,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用
Maven型:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.4.</version>
</dependency>
设置filter,本文是在tomcat中的 webapps里头自带的examples实例,在里头的web.xml添加如下代码:
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener> <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>casSingleSignOutFilter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://sso.shaw.com:8443/cas/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>casSingleSignOutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://sso.shaw.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://127.0.0.1:8080</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ignorePattern</param-name>
<param-value>/staticres/css/|/staticres/js/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>ticketValidationFilter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://sso.shaw.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://127.0.0.1:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ticketValidationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>casHttpServletRequestWrapperFilter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>casHttpServletRequestWrapperFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<filter>
<filter-name>casAssertionThreadLocalFilter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>casAssertionThreadLocalFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/error404.jsp</location>
</error-page>
<welcome-file-list>
<welcome-file>/WEB-INF/jsp/login.jsp</welcome-file>
</welcome-file-list>
测试:
本文只用一个tomcat,我们将cas-server-webapp-4.0.0改名为cas,将cas和examples放在webapps底下。如图所示:
注意:examples-WEB-INF的lib里头要有这几个jar不然启动会报错。
启动tomcat,在地址栏输入http://127.0.0.1:8080/examples,浏览器会自动跳转到cas登录页面
输入之前的用户名密码,CAS登录成功会跳转到examples页面,CAS系统整合成功。
特别注意:https连接不能跟ip地址,比如本文要用https://sso.shaw.com 这样是可以的,要是https://127.0.0.1这样服务器会报错。
补充一下:如果是为一个老项目添加单点登录功能,那么基本不需要其他的修改,设置好上面的filter即可;当然最好获取用户信息的地方都调用一个工具类,统一管理不容易出错。
九、美化CAS服务器界面
CAS服务端(cas-server)的界面只能在测试的时候用一下,真正系统上线肯定需要定制开发自己的页面,就想网易和CSDN的统一认证平台一样,所有子系统的认证都通过此平台来转接,大家可以根据他们的页面自己定制出适合所属应用或者公司的界面;简单介绍一下吧,复制cas\WEB-INF\view\jsp\default\ui的一些JSP文件,每一个文件的用途文件名已经区分了,自己修改了替换一下就可以了。
例如:
登录界面:casLoginView.jsp
登录成功:casGenericSuccess.jsp
登出界面:casLogoutView.jsp
十、结束语
本文相关资源下载:
1.cas-server-webapp-4.0.0.war CAS服务端核心代码
2.cas-client-core-3.4.1 CAS客户端核心代码
4.本文整合工程
CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas
CAS-Client下载地址:http://developer.jasig.org/cas-clients/
CAS官方教程: https://wiki.jasig.org/display/CASUM/CAS+on+Windows+Quick+Setup+Guide
CAS环境搭建-证书方式(https连接)的更多相关文章
- CAS环境搭建
实验背景: 系统环境: Windows XP | SUN JDK1.6U4 | Tomcat6.0.14 | CAS Server 3.1.1 + CAS Client 2.1.1 主机完整名称: ...
- phpstudy 安装Apache SSL证书实现https连接
Windows phpstudy安装ssl证书教程. 工具/原料 phpstudy 集成环境 申请的SSL证书 方法/步骤 首先申请免费的ssl证书,很多地方都可以申请.我是在腾讯云!如图 ...
- phpstudy 安装 Apcahe SSL证书 实现https连接
摘自:https://jingyan.baidu.com/article/64d05a022e6b57de54f73b51.html Windows phpstudy安装ssl证书教程. 工具/原料 ...
- 【mongodb 学习一】环境搭建之 mac 下连接 mongodb 的UI 客户端
记录下 mongodb 的学习 懒得自己达 mongodb 的服务器了 虽然一句命令就能搞定了 brew install mongodb 可是考虑到以后的应用还是放在网上的,就直接用现成的服务吧 下载 ...
- arm64 调试环境搭建及 ROP 实战
前言 比赛的一个 arm 64 位的 pwn 题,通过这个题实践了 arm 64 下的 rop 以及调试环境搭建的方式. 题目文件 https://gitee.com/hac425/blog_data ...
- Faster R-CNN CPU环境搭建
操作系统: bigtop@bigtop-SdcOS-Hypervisor:~/py-faster-rcnn/tools$ cat /etc/issue Ubuntu LTS \n \l Python版 ...
- 2017-01-27-hibernate环境搭建
Hibernate的环境搭建(uid方式): 1:导入包 2:创建实体对象 3:hibernate的映射配置文件 4:hibernate的核心配置文件 5:创建测试类实现表的创建 2:创建实体对象-U ...
- SpringBoot系列教程web篇之Beetl环境搭建
前面两篇分别介绍了目前流行的模板引擎Freemaker和Thymeleaf构建web应用的方式,接下来我们看一下号称性能最好的国产模板引擎Beetl,如何搭建web环境 本文主要来自官方文档,如有疑问 ...
- SpringBoot系列教程web篇之Thymeleaf环境搭建
上一篇博文介绍了如何使用Freemaker引擎搭建web项目,这一篇我们则看一下另外一个常见的页面渲染引擎Thymeleaf如何搭建一个web项目 推荐结合Freemaker博文一起查看,效果更佳 1 ...
随机推荐
- Python学习进程(1)Python简介
Python是一种结合了"解释性"."编译性"."互动性"和"面向对象"的脚本语言. (1)官方介绍: Pyth ...
- 修改subline text3左侧样式
安装PackageResourceViewer 快捷键 ⌘(command)+⇧(shift)+P 打开 Command Palette 输入 Package Control:Install 回车,等 ...
- Python编程-绑定方法、软件开发
一.绑定方法与非绑定方法 1.绑定方法 绑定给谁,谁来调用就自动将它本身当作第一个参数传入 (1)绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_method( ...
- R/Bioconductor包的下载和安装,升级
R包:基本包(自动加载)和推荐包(安装R时也会下载,但需要手动加载),拓展包(其他包,手动加载). 安装好的包将被放在一个指定的目录下.这个目录被称为库(Library).当需要使用到某一个包的时候, ...
- php数组函数-array_flip()
array_flip()函数返回一个反转后的数组,如果同一个值出现多次,则最 后一个键名作为它的值,所有其他的键名将丢失. 如果原数组中的值得数据类型不是字符串或整数,函数将报错. array_fli ...
- 20145210姚思羽《网络对抗》MSF基础应用实验
20145210姚思羽<网络对抗>MSF基础应用实验 实验后回答问题 1.用自己的话解释什么是exploit,payload,encode. exploit就是进行攻击的那一步 paylo ...
- 20165101刘天野 2017-2018-2 《Java程序设计》第6周学习总结
#20165101刘天野 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 第八章:常用实用类 String类:不可变类,一些看起来能够改变String的方法其 ...
- INSPIRED启示录 读书笔记 - 第28章 创业型公司的产品管理
产品设计方式 第一步:创业初期只设三个职位,产品经理.交互设计师和原型开发人员(职位可以兼任) 第二步:快速展开产品设计(高保真原型),邀请真实的目标用户验证产品原型,迭代修改 第三步:随着迭代的深入 ...
- 【转载】有向图强连通分量的Tarjan算法
转载地址:https://www.byvoid.com/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly conn ...
- 【P3522】TEM(单调队列+DP)
这个题,题目很长,然而亲爱的翻译已经帮你读完题了,一句话题意. 要求不下降的最长,那么这一段肯定满足队首的左区间不大于队尾的右区间,单调队列容易求解. #include<iostream> ...