`

CAS单点登录学习笔记四之HTTPS 单向认证方式 服务端和客户端配置

阅读更多

一、生成服务端密钥文件
二、生成服务端证书
三、导入证书文件到cacerts密钥库文件
四、服务端Tomcat配置
五、生成客户端密钥库文件
六、客户端应用配置
七、补充说明
八、常见配置错误

 

 

配置说明

 

 

 

一、     生成服务端密钥文件

 

登录服务器打开一个CMD窗口(开始菜单 -> 运行输入cmd后回车)并切换到tomcat安装目录下(如:c:\tomcat-cas),执行如下命令:

 

keytool -genkey -alias casserver -keypass demosso -keyalg RSA  -keystore casserver.keystore  -validity 365

 


 

执行后,可以看到tomcat安装目录下生成了一个casserver.keystore文件。如下图:

 


 

 

 

说明:-alias指定别名为casserver;-keyalg指定RSA算法;-keypass指定私钥密码;-keystore指定密钥文件名称为casserver.keystore;-validity指定有效期为365天。另外提示的输入keystore密码应与-keypass指定的相同;您的名字与姓氏是CAS服务器使用的域名(不能是IP,也不能是localhost),其它项随意填。

 

注意:服务器上如果有多个JDK,请确认环境变量中的JDK路径为tomcat所使用的JDK,如果不在环境变量中,也可切换到指定JDK的bin目录下执行命令;提示的输入keystore密码应与-keypass必须与指定的相同,否则后面tomcat启动会报IO异常(Cannot recover key)。

 

 

 

 

 

二、     生成服务端证书

 

根据以上生成的服务端的密钥文件可以导出服务端证书,执行以下命令:

 

keytool -export -alias casserver -storepass demosso -file casserver.cer -keystore casserver.keystore

 


 

执行后,可以看到tomcat安装目录下生成了一个casserver.cer文件。如下图:

 


 

 

 

说明:-alias指定别名为casserver;-storepass指定私钥为demosso;-file指定导出证书的文件名为casserver.cer;-keystore指定之前生成的密钥文件的文件名。

 

注意:-alias和-storepass必须为生成casserver.keystore密钥文件时所指定的别名和密码,否则证书导出失败,报如下错误:

 


 

 

 

 

 

三、     导入证书文件到cacerts 密钥库文件

 

导入以上生成的服务端的证书文件到一个cacerts密钥库文件,执行以下命令:

 

keytool -import -trustcacerts -alias casserver -storepass demosso  -file casserver.cer –keystore cacerts

 


 

执行后,可以看到tomcat安装目录下生成了一个cacerts文件。如下图:

 


 

 

 

 

 

四、     服务端Tomcat配置

 

在制作完成密钥文件、证书文件、密钥库文件后即可进行服务端Tomcat的配置。打开$CATALINA_HOME/conf/server.xml文件,注释掉如下代码段:

 

<Connector port="80"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

 

并取消注释<Connectorport="8443" protocol="HTTP/1.1" SSLEnabled="true"…/>代码段,修改后如下:

 

 

 

 

 

 

<Connector SSLEnabled="true" clientAuth="false"   
    keystoreFile="D:/Java/apache/apache-tomcat-cas/casserver.keystore"   
    keystorePass="demosso"   
    maxThreads="150"   
    port="443"   
    protocol="org.apache.coyote.http11.Http11Protocol"   
    scheme="https" secure="true" sslProtocol="TLS"/>  
<!--keystoreFile 生成的安全证书的位置 -->  
<!--keystorePass设置安全证书的密码-->

 

说明:port一般为8443或443,最常用的是443端口(https默认端口),这样https方式访问的时候可以不加端口号(如:https://sso.demo.com/cas/login);keystoreFile为tomcat目录下的密钥文件;keystorePass为私钥密码;truststoreFile为生成的信任文件,如果此处不指定则默认为$JAVA_HOME/jre/lib/security/cacerts文件;其它属性默认即可。

 

 

五、     生成客户端密钥库文件

单向认证的客户端配置只需生成客户端信任文件caserts即可。首先将服务端生成的证书文件(之前生成的casserver.cer文件)复制到$JAVA_HOME/jre/lib/security下,然后打开CMD窗口切换到$JAVA_HOME/jre/lib/security下并执行命令:

keytool -import -trustcacerts -alias casclient -storepass changeit -file casserver.cer -keystore cacerts


 

执行后,可以看到$JAVA_HOME/jre/lib/security目录下生成了一个cacerts文件。如下图:

 

备注:JDK JRE security  storepass 默认密码 changeit

 

六、     客户端应用配置

1、应用程序WEB-INF\lib目录下加入cas-client-core-3.2.1.jar包并添加到buildpath中;

2、编辑应用程序中的web.xml文件在最末端加入如下内容:

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
	<listener>
		<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
	</listener>
	<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
	<filter>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 该过滤器负责用户的认证工作,必须启用它 -->
	<filter>
		<filter-name>CAS Authentication Filter</filter-name>
		<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
		<init-param>
			<param-name>casServerLoginUrl</param-name>
			<param-value>https://sso.demo.com/cas/login</param-value>
		</init-param>
		<init-param>
			<param-name>renew</param-name>
			<param-value>false</param-value>
		</init-param>
		<init-param>
			<param-name>gateway</param-name>
			<param-value>false</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8082</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CAS Authentication Filter</filter-name>
		<url-pattern>/login-page.html</url-pattern>
	</filter-mapping>
	<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
	<filter>
		<filter-name>CAS Validation Filter</filter-name>
		<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
		<init-param>
			<param-name>casServerUrlPrefix</param-name>
			<param-value>https://sso.demo.com/cas</param-value>
		</init-param>
		<init-param>
			<param-name>serverName</param-name>
			<param-value>http://localhost:8082</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>
	</filter>
	<filter-mapping>
		<filter-name>CAS Validation Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
	<filter>
		<filter-name>CAS HttpServletRequest WrapperFilter</filter-name>
		<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>CAS HttpServletRequest WrapperFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
	<filter>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>CAS Assertion Thread Local Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 自定义的filter,在用户登录成功之后进行处理 -->
	<filter>
		<filter-name>AuthenticationFilter</filter-name>
		<filter-class>com.filter.AuthenticationFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AuthenticationFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

 

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.jasig.cas.client.validation.Assertion;

public class AuthenticationFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
                            ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // _const_cas_assertion_是CAS中存放登录用户名的session标志
        Object object = httpRequest.getSession().getAttribute("_const_cas_assertion_");
        if (object != null) {
            Assertion assertion = (Assertion) object;
            String loginName = assertion.getPrincipal().getName();
            User user = session 中获取user对象
            // 第一次登录系统
            if (user == null) {
   		自行实现获User对象的方法                
                //User _user = userService.getUserByName(loginName);
                // 保存用户信息到Session
                //setCurrentUser(httpRequest, _user);
                System.out.println("current user :" + _user);
            }
        }
        filterChain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

 

说明:LoginFilter内容一般为获取用户基本信息、菜单信息然后保存到session中;sso.demo.com为CAS服务器的域名,也就是之前使用keytool –genkey命令指定的“名字与姓氏”。若未申请域名,也可以本地模拟实现域名解析,编辑C:\WINDOWS\system32\drivers\etc\hosts文件添加:CAS服务器IP  sso.demo.com 即可),如下图:


注意:serverName属性值为客户端实际IP地址,可以为域名但绝不能为localhost!

 

1、   客户端程序单点退出功能,需要访问https://sso.demo.com/cas/logout,下面提供了一个示例,当点击退出按钮(或超链接)时,调用javascript方法ssoLogout()。ssoLogout()定义如下(可根据实际需求自行修改):

 

[javascript] view plaincopyprint?
  1. <scripttype="text/javascript">  
  2. function ssoLogout(){  
  3.     if(confirm('确定要退出系统吗?')){  
  4.         top.location.href ='https://sso.demo.com/cas/logout?service='+location.protocol+'//'+location.host+location.pathname;  
  5.     }  
  6. }  
  7. </script>  

 

 

七、     补充说明

上面讲的是CAS单独部署的情况,也就是与其它应用分开部署。但有些情况是CAS与其它应用部署到同一台机器同一个Tomcat(关键问题是使用同一个JDK),这种情况下,服务端Tomcat配置中的<Connector truststoreFile属性就要指定为jdk下的cacerts文件路径或者直接注释掉(默认会找$JAVAHOME\jre\lib\security\下的cacerts文件)。这样服务端和客户端是同一个,也就不必再根据服务端证书生成客户端密钥库文件了。

 

 

八、     常见配置错误

1、  CAS服务端Tomcat启动后报错:Error initializing endpoint java.io.IOException: Cannot recover key

是由于生成服务端密钥文件时所指定的keypass与提示输入的“keystore密码”不一致。

2、  javax.servlet.ServletException: org.jasig.cas.client.validation.TicketValidationException:绁ㄦ牴'ST-2-hozuLnLtIVGeaD5yju0Y-cas'涓嶇鍚堢洰鏍囨湇鍔?

一般是由于客户端应用web.xml中配置的serverName属性值为localhost或CAS服务端cas-servlet.xml配置文件中的<bean logoutController/>没加p:followServiceRedirects="true"退出后重定向属性。

3、  SSLHandshakeException: java.security.cert.CertificateException: Nosubject alternative names present

是由于客户端应用web.xml配置中的casServerLoginUrl和casServerUrlPrefix两个URL属性的域名与证书中定义的不一致。

 

注意:

1、keytool 生成安全证书不能使用IP地址 一律使用域名

2、务必确认客户端程序使用JDK 路径正确 分清楚JDK、JRE

 

分享到:
评论
2 楼 pshaoyi 2015-05-28  
你好,我现在遇到一个问题,从CAS跳回到客户端,客户端获取的中文数据全部乱码了,请问这个问题你遇到过没?
1 楼 bao梦 2014-07-31  
第三步中的demosso是之前的密码吗?还是什么啊?我在执行的时候总是提示用法错误

相关推荐

    CAS单点登录例子,包含服务端和客户端

    综上所述,这个压缩包提供了一个完整的CAS单点登录实例,包括服务端和客户端的实现,可以帮助开发者理解并部署自己的CAS系统。通过深入研究和实践,你可以掌握如何利用CAS实现Web应用的安全、便捷的单点登录功能。

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录...通过学习和实践,你可以掌握CAS的核心概念,实现自定义认证策略,以及优化客户端集成,从而为你的项目构建一个强大而安全的单点登录系统。

    cas单点登录服务端+客户端demo

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决用户在多个应用系统间切换时需要多次认证的问题。它提供了一个集中式的登录入口,用户只需在一...

    CAS服务端和客户端war包.rar

    总的来说,这个压缩包提供了完整的CAS SSO解决方案,包括服务器端和两个示例客户端应用,方便开发者或管理员快速搭建和测试单点登录环境。理解CAS的工作原理和配置方法对于构建安全、便捷的身份验证系统至关重要。

    cas实现单点登录服务端及客户端

    CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,SSO)框架,由耶鲁大学开发并维护。SSO允许用户通过一次登录验证就能访问多个应用系统,无需在每个系统之间单独进行...

    cas单点登录代码例子 有文档 服务端客户端例子 亲测可用

    CAS(Central Authentication Service)是Java开发的一个开源单点登录(Single Sign-On,SSO)框架,主要用于实现用户在多个应用系统中的统一身份验证。在这个压缩包中,包含了一个CAS服务端和客户端的代码实例,...

    cas单点登录服务端

    CAS(Central Authentication ...总的来说,CAS单点登录服务端的部署涉及了Web应用的部署、应用服务器的管理、服务定义配置、用户认证集成以及安全性考量等多个方面,是构建安全、便捷的多应用系统环境的关键组件。

    sso/cas单点登录Java maven版 含服务端客服端

    4. 验证成功后,客户端会创建一个本地会话,存储用户的认证信息,从而实现单点登录的效果。 5. 客户端也需要配置CAS服务器的URL和其他相关信息,以便与服务端进行通信。 在实际部署中,需要注意以下几点: 1. 安全...

    cas 普通方式和SpringBoot方式客户端 普通方式服务端

    在本文中,我们将探讨如何在普通方式和Spring Boot方式下配置和使用CAS客户端和服务端。 首先,让我们了解一下`CMD生成证书命令.txt`。在CAS部署中,安全通信通常依赖于SSL/TLS证书,用于加密传输数据。这个文件...

    cas服务端和客户端可用代码

    CAS(Central Authentication Service)是一种基于Web的单一登录(Single Sign-On, SSO)协议,它允许用户通过一个统一的身份验证入口点登录,然后在多个应用系统间自由切换,而无需再次进行身份验证。这个给定的...

    CAS4.1.4服务端和客户端实例

    CAS(Central Authentication Service)是...通过这个实例,你可以深入了解SSO的工作原理,学习如何配置和部署CAS服务,以及如何在自己的应用中实现CAS客户端,这对于提升企业级应用的安全性和用户体验有着重要的作用。

    SSO之CAS单点登录客户端服务端jar包

    在"SSO之CAS单点登录客户端服务端jar包"中,包含的是实现CAS单点登录功能所需的客户端和服务端组件。这些jar包包含了以下关键知识点: 1. **CAS服务器**:这是整个SSO架构的核心,负责处理用户的登录请求,验证凭证...

    单点登录服务端项目cas-server

    单点登录服务端项目cas-server单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-server 单点登录服务端项目cas-...

    cas4.2.7服务端和客户端应用

    **CAS (Central Authentication Service) 知识点详解** CAS 是一个开源的身份验证框架,它允许用户通过单一登录(Single Sign-On, SSO)在多个应用系统间自由切换,无需重复登录。CAS4.2.7 版本是 CAS 的一个稳定...

    落雨博客基于CAS框架的单点登录技术讲解(ppt+code实例+doc)配套资料

    [置顶] SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析 http://blog.csdn.net/ae6623/article/details/8848107 目 录 1 引言 4 1.1 摘要 4 1.2 范围 4 1.3 读者对象 4 1.4 关键词 4 2 ...

    springmvc+spring+shiro+cas单点登录实例

    springmvc+spring+shiro+cas单点登录实例 加入了登录验证码认证,修改了下首页样式,不过样式没有弄好,很丑的,有空自己再弄下 说明:cas-server是单点登录服务端,用的是maven项目,但是WEB-INF里面的lib目录下面...

    CAS单点登录配置大全

    **CAS单点登录配置大全** CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On,SSO)协议。它允许用户通过一个统一的认证系统访问多个应用系统,而无需在每个系统...

    cas 单点登录 解决方案.

    cas 单点登录解决方案可以通过多种方式来实现,例如使用 cas 服务器、LDAP 服务器、Active Directory 等。 cas 服务器可以作为身份验证服务器,LDAP 服务器可以作为用户信息存储服务器,Active Directory 可以作为...

    cas sso单点登录已搭建好的源码-内含客户端和服务端

    本资源包含已搭建好的CAS SSO服务端和客户端的源码,方便开发者进行二次开发或学习研究。 在SSO系统中,CAS服务器作为中心认证服务,处理用户的登录请求,验证凭证并返回一个服务票(Service Ticket)。客户端应用...

    java-cas单点登录服务端

    CAS(Central Authentication Service)是一款不错的针对 Web 应用的单点登录框架,本文介绍了 CAS 的原理、协议、在 Tomcat 中的配置和使用,研究如何采用 CAS 实现轻量级单点登录解决方案。 CAS 是 Yale 大学发起的...

Global site tag (gtag.js) - Google Analytics