CAS_SSO单点登录实例详细步骤(转)、Tomcat ssl(https) 配置

CAS_SSO单点登录实例详细步骤(转)、Tomcat ssl(https) 配置      
    
博客分类:
SSO&CAS&Identity

Java.Tomcat

 

    0, 从CAS官网下载最新版本的CAS服务器:cas-server-3.5.1-release.zipjava版客户端cas-client-3.2.1-release.zip

1, 修改hosts文件,添加域名方便演示
127.0.0.1    cas.my.com #对应部署cas server的tomcat,这个虚拟域名还用于证书生成
127.0.0.1    app1.my.com # 对应部署app1 的tomcat
127.0.0.1    app2.my.com #对应部署app2 的tomcat

2, JDK安装, JAVA_HOME

3, 数字证书配置 - 生成数据证书文件(数据库)。所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。

keytool -genkey -alias casdemo -keyalg RSA -keysize 1024 -storepass P@ssw0rd -keypass P@ssw0rd -validity 365 -keystore E:\WorkRecords\CAS\casdemo.keystore

-storepass 指定私钥数据库keystore的密码(所有访问keystore文件的命令都要提供改密码)
-keypass 用来保护密钥对中的私钥。
-keypass 和 storepass 两个密码要一致,否则下面tomcat 配置https 访问会报错误(tomcat下配置文件对应的属性名叫keystorePass):java.io.IOException: Cannot recover key

可以使用下述命令修改keypass 和 storepass
keytool -alias casdemo -storepasswd -keystore E:\WorkRecords\CAS\casdemo.keystore -storepass sP@ssw0rd -new P@ssw0rd

keytool -alias casdemo -keypasswd -keystore E:\WorkRecords\CAS\casdemo.keystore -storepass P@ssw0rd -keypass kP@ssw0rd -new P@ssw0rd

紧跟着输入的证书名CN必须是服务器的域名:cas.my.com

4, 数字证书配置 - 从数据证书数据库中导出指定的数字证书文件,数字证书文件只包括主体信息和对应的公钥。 

keytool -export -alias casdemo -keystore E:\WorkRecords\CAS\casdemo.keystore -file E:\WorkRecords\CAS\casdemo.crt -storepass P@ssw0rd

5,客户端导入 - 在客户端导入数字证书(包含主体信息和对应的公钥)
keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file E:\WorkRecords\CAS\casdemo.crt

注意:cacerts是certified authority certificates的缩写,就是java存放证书的证书库。访问这个文件的默认密码是changeit,要把证书导入到这里时,系统会提示你输入该密码。可以通过下面的命令把cacerts的访问密码改成cP@ssw0rd

keytool -storepasswd -alias casdemo -keystore %JAVA_HOME%\jre\lib\security\cacerts -storepass changeit -new cP@ssw0rd

6,tomcat容器启用https访问
修改conf/server.xml配置文件,启用8443端口配置,并增加属性keystoreFile="E:\WorkRecords\CAS\casdemo.keystore" keystorePass="P@ssw0rd" URIEncoding="UTF-8"

然后重启tomcat
https://localhost:8443/cas-server-webapp-3.5.1/login

keystoreFile 就是创建的私钥证书的路径
keystorePass 就是创建的私钥证书的访问密码

7,部署CAS-Server相关的Tomcat,参考CAS-Server下载目录下的INSTALL.txt安装
把cas-server-3.5.1\modules\cas-server-webapp-3.5.1.war复制到tomcat webapps目录下,然后重启tomcat,用下面路径访问CAS服务器

https://localhost:8443/cas-server-webapp-3.5.1/login
默认的cas server的验证是只要用户名和密码一样就可以成功登录。(仅仅用于测试,生成环境需要根据实际情况修改)

8,部署CAS-Client相关的Tomcat:参考Configuring the Jasig CAS Client for Java in the web.xml

把cas-client-3.2.1/modules/cas-client-core-3.2.1.jar复制到你所发布的webapp的WEB-INF/lib下(测试时可以使用tomcat下的example做例子),在客户端web应用中修改WEB-INF/web.xml 在里面添加如下过滤器

Java代码  

  1. <!-- 用于单点退出 -->  
  2. <listener>  
  3.     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
  4. </listener>  
  5. <filter>  
  6.     <filter-name>CAS Single Sign Out Filter</filter-name>  
  7.     <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
  8. </filter>  
  9. <!-- 用于单点登录 -->  
  10. <filter>  
  11.     <filter-name>CASFilter</filter-name>  
  12.     <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>  
  13.     <init-param>  
  14.         <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>  
  15.         <param-value>https://cas.my.com:8443/cas/login</param-value>  
  16.         <!--这里的server是服务端的IP-->  
  17.     </init-param>  
  18.     <init-param>  
  19.         <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>  
  20.         <param-value>https://cas.my.com:8443/cas/proxyValidate</param-value>  
  21.         <!--这里的ServerName是服务端的主机名也就是CN-->  
  22.     </init-param>  
  23.     <init-param>  
  24.         <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>  
  25.         <param-value>localhost:8080</param-value>  
  26.         <!--client:port就是需要cas需要拦截的地址和端口,一般就是这个tomcat所启动的ip和port-->  
  27.     </init-param>  
  28. </filter>  
  29. <filter-mapping>  
  30.     <filter-name>CAS Single Sign Out Filter</filter-name>  
  31.     <url-pattern>/*</url-pattern>  
  32. </filter-mapping>  
  33. <filter-mapping>  
  34.     <filter-name>CASFilter</filter-name>  
  35.     <url-pattern>/*</url-pattern>  
  36. </filter-mapping>  
  37.   
  38. <!-- 该过滤器负责实现HttpServletRequest请求的包裹,  
  39.     比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。  
  40. -->  
  41. <filter>  
  42.     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  43.     <filter-class>  
  44.                     org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>  
  45. </filter>  
  46. <filter-mapping>  
  47.     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  48.     <url-pattern>/*</url-pattern>  
  49. </filter-mapping>  
  50.   
  51. <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。  
  52.     比如AssertionHolder.getAssertion().getPrincipal().getName()。  
  53. -->  
  54. <filter>  
  55.     <filter-name>CAS Assertion Thread Local Filter</filter-name>  
  56.     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>  
  57. </filter>  
  58. <filter-mapping>  
  59.     <filter-name>CAS Assertion Thread Local Filter</filter-name>  
  60.     <url-pattern>/*</url-pattern>  
  61. </filter-mapping>  
	<!-- 用于单点退出 -->
	<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>
		<filter-name>CASFilter</filter-name>
		<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
		<init-param>
			<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
			<param-value>https://cas.my.com:8443/cas/login</param-value>
			<!--这里的server是服务端的IP-->
		</init-param>
		<init-param>
			<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
			<param-value>https://cas.my.com:8443/cas/proxyValidate</param-value>
			<!--这里的ServerName是服务端的主机名也就是CN-->
		</init-param>
		<init-param>
			<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
			<param-value>localhost:8080</param-value>
			<!--client:port就是需要cas需要拦截的地址和端口,一般就是这个tomcat所启动的ip和port-->
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CASFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 该过滤器负责实现HttpServletRequest请求的包裹,
		比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
	-->
	<filter>
		<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
		<filter-class>
 	                org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>CAS HttpServletRequest Wrapper Filter</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>

借以tomcat默认自带的 webapps\examples 作为演示的简单web项目,访问url:http://localhost:8080/examples/servlets/

9, 获取登录用户的信息

Java代码  

  1. import java.io.*;  
  2. import java.util.*;  
  3. import java.util.Map.Entry;  
  4.    
  5. import javax.servlet.*;  
  6. import javax.servlet.http.*;  
  7.    
  8. import org.jasig.cas.client.authentication.AttributePrincipal;  
  9. import org.jasig.cas.client.util.AbstractCasFilter;  
  10.     import org.jasig.cas.client.validation.Assertion;  
  11.        
  12.     /** 
  13.      * The simplest possible servlet. 
  14.      * 
  15.      * @author James Duncan Davidson 
  16.      */  
  17.        
  18.     public class HelloWorldExample extends HttpServlet {  
  19.        
  20.         public void doGet(HttpServletRequest request, HttpServletResponse response)  
  21.                 throws IOException, ServletException {  
  22.             ResourceBundle rb = ResourceBundle.getBundle("LocalStrings", request  
  23.                     .getLocale());  
  24.             response.setContentType("text/html");  
  25.             PrintWriter out = response.getWriter();  
  26.        
  27.             out.println("<html>");  
  28.             out.println("<head>");  
  29.        
  30.             String title = rb.getString("helloworld.title");  
  31.        
  32.             out.println("<title>" + title + "</title>");  
  33.             out.println("</head>");  
  34.             out.println("<body bgcolor=\"white\">");  
  35.        
  36.             out.println("<a href=\"../helloworld.html\">");  
  37.             out.println("<img src=\"../images/code.gif\" height=24 "  
  38.                     + "width=24 align=right border=0 alt=\"view code\"></a>");  
  39.             out.println("<a href=\"../index.html\">");  
  40.             out.println("<img src=\"../images/return.gif\" height=24 "  
  41.                     + "width=24 align=right border=0 alt=\"return\"></a>");  
  42.             out.println("<h1>" + title + "</h1>");  
  43.        
  44.             Assertion assertion = (Assertion) request.getSession().getAttribute(  
  45.                     AbstractCasFilter.CONST_CAS_ASSERTION);  
  46.        
  47.             if (null != assertion) {  
  48.                 out.println(" Log | ValidFromDate =:"  
  49.                         + assertion.getValidFromDate() + "<br>");  
  50.                 out.println(" Log | ValidUntilDate =:"  
  51.                         + assertion.getValidUntilDate() + "<br>");  
  52.                 Map<Object, Object> attMap = assertion.getAttributes();  
  53.                 out.println(" Log | getAttributes Map size = " + attMap.size()  
  54.                         + "<br>");  
  55.                 for (Entry<Object, Object> entry : attMap.entrySet()) {  
  56.                     out.println("     | " + entry.getKey() + "=:"  
  57.                             + entry.getValue() + "<br>");  
  58.                 }  
  59.        
  60.             }  
  61.             AttributePrincipal principal = assertion.getPrincipal();  
  62.        
  63.             // AttributePrincipal principal = (AttributePrincipal) request  
  64.             // .getUserPrincipal();  
  65.        
  66.             String username = null;  
  67.             out.print(" Log | UserName:");  
  68.             if (null != principal) {  
  69.                 username = principal.getName();  
  70.                 out.println("<span style='color:red;'>" + username + "</span><br>");  
  71.             }  
  72.        
  73.             out.println("</body>");  
  74.             out.println("</html>");  
  75.         }  
	import java.io.*;
	import java.util.*;
	import java.util.Map.Entry;

	import javax.servlet.*;
	import javax.servlet.http.*;

	import org.jasig.cas.client.authentication.AttributePrincipal;
	import org.jasig.cas.client.util.AbstractCasFilter;
 	import org.jasig.cas.client.validation.Assertion;

 	/**
 	 * The simplest possible servlet.
 	 *
 	 * @author James Duncan Davidson
 	 */

 	public class HelloWorldExample extends HttpServlet {

 	    public void doGet(HttpServletRequest request, HttpServletResponse response)
 	            throws IOException, ServletException {
 	        ResourceBundle rb = ResourceBundle.getBundle("LocalStrings", request
 	                .getLocale());
 	        response.setContentType("text/html");
 	        PrintWriter out = response.getWriter();

 	        out.println("<html>");
 	        out.println("<head>");

 	        String title = rb.getString("helloworld.title");

 	        out.println("<title>" + title + "</title>");
 	        out.println("</head>");
 	        out.println("<body bgcolor=\"white\">");

 	        out.println("<a href=\"../helloworld.html\">");
 	        out.println("<img src=\"../images/code.gif\" height=24 "
 	                + "width=24 align=right border=0 alt=\"view code\"></a>");
 	        out.println("<a href=\"../index.html\">");
 	        out.println("<img src=\"../images/return.gif\" height=24 "
 	                + "width=24 align=right border=0 alt=\"return\"></a>");
 	        out.println("<h1>" + title + "</h1>");

 	        Assertion assertion = (Assertion) request.getSession().getAttribute(
 	                AbstractCasFilter.CONST_CAS_ASSERTION);

 	        if (null != assertion) {
 	            out.println(" Log | ValidFromDate =:"
 	                    + assertion.getValidFromDate() + "<br>");
 	            out.println(" Log | ValidUntilDate =:"
 	                    + assertion.getValidUntilDate() + "<br>");
 	            Map<Object, Object> attMap = assertion.getAttributes();
 	            out.println(" Log | getAttributes Map size = " + attMap.size()
 	                    + "<br>");
 	            for (Entry<Object, Object> entry : attMap.entrySet()) {
 	                out.println("     | " + entry.getKey() + "=:"
 	                        + entry.getValue() + "<br>");
 	            }

 	        }
 	        AttributePrincipal principal = assertion.getPrincipal();

 	        // AttributePrincipal principal = (AttributePrincipal) request
 	        // .getUserPrincipal();

 	        String username = null;
 	        out.print(" Log | UserName:");
 	        if (null != principal) {
 	            username = principal.getName();
 	            out.println("<span style='color:red;'>" + username + "</span><br>");
 	        }

 	        out.println("</body>");
 	        out.println("</html>");
 	    }

keytool报错误:keytool error: java.security.UnrecoverableKeyException: Cannot recover key

表明:命令中输入的keyPass不正确

参考:
CAS官网地址:http://www.jasig.org/cas

CAS帮助文档:https://wiki.jasig.org/display/CASUM/Home

keytool - Key and Certificate Management Tool: 管理私钥数据库(keystore)以及私钥关联的X.509证书链验证的对应公钥(证书),同时也为受信实体管理证书。

keytool工具的详细运用

CAS_SSO单点登录实例详细步骤

SSO之CAS单点登录实例演示  

时间: 2024-08-31 03:35:19

CAS_SSO单点登录实例详细步骤(转)、Tomcat ssl(https) 配置的相关文章

【SSO-CAS】SSO之CAS单点登录实例演示

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.    ----------------------------------------------------------------------------

快速教您Apache + Tomcat + SSL的配置

apache 我的运行环境:Windows2003 Server SP4 + J2SDK1.5.0 + Apache2.0.54 + Tomcat5.5.9 准备软件: 1.安装 Apache 2.0.54 2.Tomcat 5.5.14 3.Jk2连接器(mod_jk2.so) 一:配置Apache和tomcat Apache安装在d:\Apache2 下,监听端口 80: Tomcat在D:\Tomcat51 下,监听端口 8080: 两者都以windows 2000服务进行安装. 将mod

搭建Jasig CAS中央认证服务实现单点登录——搭建Tomcat并实现SSL安全连接

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1167444 预期的工作任务: 实现CAS(CAS采用Jasig CAS)单点登录搭建,开发api以实现java.php..net等单点登录接口:实现数据库.LDAP身份认证对接. (一)平台(Linux和Windows都能实现): 1.Windows Server 2008 R2(Windows 2000以上即可)

SSO单点登录的PHP实现方法(Laravel框架)_php实例

Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于表达力. 简单说一下我的逻辑,我也不知道我理解sso对不对. 假如三个站点 a.baidu.com b.baidu.com c.baidu.com a.baidu.com 作为验证用户登录账户. b和c作为客户端(子系统). b和c需要登录的时候跳转到a,并且携带参数source指明登陆后跳转的链接

JEESZ分布式框架--单点登录集成方案

  JEESZ分布式框架单点登录集成方案第一节:单点登录简介 第一步:了解单点登录 SSO主要特点是: SSO应用之间使用Web协议(如HTTPS) ,并且只有一个登录入口. SSO的体系中有下面三种角色: 1) User(多个) 2) Web应用(多个) 3) SSO认证中心(一个) SSO实现包含以下三个原则: 1) 所有的登录都在 SSO 认证中心进行.   2) SSO认证中心通过一些方法来告诉Web应用当前访问用户究竟是不是通过认证的用户.   3) SSO认证中心和所有的 Web 应

CAS单点登录时AJAX页面刷新无反应(302 Moved Temporarily)

最近使用CAS做单点认证服务时发现过大概二十分钟后就发现凡是异步方式刷新页面就无反应了(由于使用EasyUI框架,所以页面刷新基于ajax+div方式),刚开始一直认为是CAS服务端超时的问题,查看了各个配置,网上也参考了许多帖子,一直没有解决,今天无意想起来是不是session过期了呢,因为单点登录客户端没有配置任何session有效时长,也就是说客户端的session时长为tomcat默认时长(网上有人说Tomcat默认session有效期为30分钟,而现在发现的是大概20分钟后就会出现用a

单点登录系统CAS筹建及取得更多用户信息的实现

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为"中国PE第一股",市值超1000亿元.    ----------------------------------------------------------------------------

“.NET研究”SharePoint 2010中的单点登录

在SharePoint 2007时代我们可以通过Microsoft Single Sign-on Service来实现单点登录,但到了SharePoint 2010中不再有Single Sign-on这个服务了,取而代之的则是Secure Store Service简称SSS.与以前的SSO一样,SSS也提供了一个数据库实例来保存用于访问某些外部应用程序或外部数据源的用户凭据信息,所不同的是我们不仅可以使用SSS中保存的凭据信息来实现单点登录,同时BDC.Excel Service等服务应用程序

一起谈.NET技术,SharePoint 2010中的单点登录

在SharePoint 2007时代我们可以通过Microsoft Single Sign-on Service来实现单点登录,但到了SharePoint 2010中不再有Single Sign-on这个服务了,取而代之的则是Secure Store Service简称SSS.与以前的SSO一样,SSS也提供了一个数据库实例来保存用于访问某些外部应用程序或外部数据源的用户凭据信息,所不同的是我们不仅可以使用SSS中保存的凭据信息来实现单点登录,同时BDC.Excel Service等服务应用程序