CAS应用实践

keystool生成,导入:
keytool -genkey -alias tomcat -keyalg RSA
keytool -export -alias tomcat -file server.crt
keytool -import -file server.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts


CAS配置详解
From OseWiki
Jump to: navigation, search
1.下载cas-server和cas-client(可选,建议使用)

http://www.ja-sig.org/downloads/cas/cas-server-3.0.zip
http://www.yale.edu/tp/cas/cas-client-2.0.11.zip

2.将cas-server-3.0.zip解压,并将lib/cas.war拷贝到server1的webapps下

3.产生SERVER的证书

keytool -genkey -alias my-alias-name -keyalg RSA -keystore  keystore.keystore 首先在命令行中切换到 %java_home%\jre\lib\security目录 %java_home%\bin\keytool -genkey -alias tomcat -keyalg RSA 密码是:changeit 姓名是:localhost 其他随便写的 之后是 %java_home%\bin\keytool -export -alias tomcat -file server.crt (导出SERVER的证书,用来给所有需要用到的客户端导入) 和 %java_home%\bin\keytool -import -file server.crt -keystore % java_home%/jre/lib/security/cacerts  (在客户端的JVM里导入信任的SERVER的证书(根据情况有可能需要管理员权限)
4.在server1配置tomcat使用HTTPS $CATALINA_HOME/conf/server.xml里

<Connector port="8443"   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  enableLookups="false" disableUploadTimeout="true"  acceptCount="100" debug="0" scheme="https" secure="true"  clientAuth="false" sslProtocol="TLS"   keystoreFile="C:\Documents and Settings\new\keystore.keystore"   keystorePass="changeit" />
5.在要使用CAS的客户端client1里设置(以servlets-examples这个APP为例),我们使用ServletFilter(CAS client里提供的)来实现SSO的检查。将cas-client-2.0.11\java\lib文件复制到%tomcat_home%\webapps\servlets- examples\WEB-INF\lib中(没有lib文件夹,自己建一个) 修改servlets-examples/WEB-INF/web.xml

<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://localhost:8443/cas/login</param-value>   </init-param>   <init-param>       <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>       <param-value>https://localhost:8443/cas/proxyValidate</param-value>   </init-param>   <init-param>       <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>       <param-value>localhost:8080</param-value>   </init-param>   </filter>   <filter-mapping>       <filter-name>CASFilter</filter-name>       <url-pattern>/servlet/*</url-pattern>   </filter-mapping>
6.将cas-client-2.0.11.zip解压,把java/lib/casclient.jar拷贝到client1服务器上的webapps/servlets-examples/WEB-INF/lib目录下(如果没有就建一个)

7.导出SERVER的证书,用来给所有需要用到的客户端导入 (在第三步生成这里重复一下) keytool -export -file myserver.cert -alias my-alias-name -keystore keystore.keystore

8.test & done. 把server1和client1分别起来,检查启动的LOG是否正常,如果一切OK,就访问 http://client1:8080/servlets-examples/servlet/HelloWorldExample 系统会自动跳转到一个验证页面,随便输入一个相同的账号,密码,严正通过之后就会访问到真正的HelloWorldExample这个servlet了

取自"http://www.ose.com.cn/wiki/index.php?title=CAS%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3"

CAS介绍
From OseWiki
Jump to: navigation, search
CAS背景介绍

CAS(Central Authentication Service),是耶鲁大学开发的单点登录系统(SSO,single sign-on),应用广泛,具有独立于平台的,易于理解,支持代理功能。CAS系统在各个大学如耶鲁大学、加州大学、剑桥大学、香港科技大学等得到应用。

Spring Framework的Acegi安全系统支持CAS,并提供了易于使用的方案。Acegi 安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全系统能够轻松地适用于复杂的安全需求。 Acegi安全系统在国内外得到了广泛的应用,有着良好的社区环境。

CAS的设计目标

(1)为多个Web应用提供单点登录基础设施,同时可以为非Web应用但拥有Web前端的功能服务提供单点登录的功能;

(2)简化应用认证用户身份的流程;

(3)将用户身份认证集中于单一的Web应用,让用户简化他们的密码管理,从而提高安全性;而且,当应用需要修改身份验证的业务逻辑时,不需要到处修改代码。

CAS的实现原理


CAS(Central Authentication Server)被设计成一个独立的Web应用。实现原理非常简单,CAS Server2.0.12的实现只有30个类,除了JDK本身外,只使用到一个 servlet.jar包。它目前的实现是运行在HTTPS服务器的几个Java Servlet上(而客户端可以灵活采用http和https的方式)。通过CAS2.0.12认证的序列图如下图(因图片显示问题,暂时去除)。


CAS在应用中的运行硬件环境 University of Delaware: Sun Fire 280R/ 2x750 MHz/ 4 GB memory/ 550.3 GB disk storage University of Hawaii: a single Sun Netra X1 (UltraSPARC-IIe 500MHz) with 1.0GB RAM dedicated to running CAS. 2. CAS2.0.12中关于ticket的生成


CAS创建一个位数很长的随机数(ticket)。CAS把这个ticket和成功登录的用户以及用户要访问的service联系起来。例如,如果用户peon重定向自service S,CAS创建ticket T,这个ticket T允许peon访问service S。这个ticket是个一次性的凭证;它仅仅用于peon和仅仅用于service S,并且只能使用一次,使用之后马上会过期,即ticket通过验证,CAS立即删除该ticket,使它以后不能再使用。这样可以保证其安全性。

关于ST,在取一个ST时,即使用deleteTicket(ticketId)同时将一次性的ST删除;而对于TGT或PT,则通过resetTimer(ticketId)以更新TGT或PT的时间。在CAS服务端返回的ST中只能得出用户名。

取自"http://www.ose.com.cn/wiki/index.php?title=CAS%E4%BB%8B%E7%BB%8D"



[学习] 使用 CAS 实现 SSO 实践过程
前一段时间曾经研究过一段关于 SSO 的技术,也深知 SSO(Single Sign-On) 是一个博大精深的主题,而我们通常提起的仅仅是所谓的 WebApp SSO,其主要特点是SSO 应用之间走Web协议 ( 如 HTTP/SSL) ,并且 SSO 都只有一个登录入口,SSO 的核心就是所谓的单点登录和身份认证。

CAS(Central Authentication Service) 是 Yale 大学发起的一个开源项目,据统计,大概每 10 个采用开源构建 Web SSO 的 Java 项目,就有 8 个使用 CAS 。对这些统计,我虽然不以为然,但有一点可以肯定的是,CAS 是我认为最简单实效,而且足够安全的 SSO 选择。前一段时间正好做了配置 CAS 的实践,记下主要步骤,以供日后参考。

1.系统配置

以下是必需的软件环境:
1. JDK 1.4.2 or higher
2. Tomcat 5.X
3. JSSE-1_X(安装方法可见下载包)

2. Tomcat 配置,启用SSL

a. 在要安装CAS的机器上为Tomcat生成用于SSL通讯的密钥:%JAVA_HOME%/bin/keytool -genkey -alias tomcat -keyalg RSA
这时需要输入密钥密码和其他参数(第一个参数CN必须设置为CAS机器名,这里架设为 james-huang,本机使用localhost测试),会在系统用户目录中生成.keystore密钥文件。

b. 导出别名为tomcat的密钥文件:%JAVA_HOME%/bin/keytool -export -file /path/server.crt -alias tomcat 这时需要输入上一步设定的密码,结果会在/path/目录生成server.crt信任状。

c. 为客户端的JVM导入密钥::%JAVA_HOME%/bin/keytool -import -keystore $JAVA_HOME/jre/lib/security/cacerts -file /path/server.crt -alias tomcat 注意:输入密码时密码为"changeit",这是默认密码。

d. 修改服务端Tomcat配置文件,启用SSL:修改$CATALINA_HOME/conf/server.xml,去掉有关SSL的那一段的注释,需要 在connector字段中加 keystorePass="password"(password即为1、2步中的密码),keystoreFile="keystorePath" (可以把第一步生成的.keystore复制到$CATALINA_HOME/conf/下,这样keystoreFile= "conf/.keystore")。重启Tomcat,测试 https://james-huang:8443 是否可以访问(推荐将服务器填上Server的机器名)。

3. CAS Server安装

下载CAS Server 3.0.6(可到耶鲁大学官方站或者到 http://www.ja-sig.org/products/cas/ 下载),将其中的cas.war复制到$CATALINA_HOME/webapps下(当然现在CAS中的用户密码认证是很简陋的,产品化必须重写这部分代码,生成新的cas.war)。这时,重启Tomcat应该就可以通过访问 https://james-huang:8443/cas 看到CAS的登录界面了。

4. CAS Client 部署

建议自己创建一个Project以便进行试验(架设工程名为 casclient),下载最新版本的Yale Java CAS Client(2.0.11)并将casclient.jar复制到这两个项目的WEB-INF目录的lib下。修改两个项目的WEB-INF/web.xml,添加如下的过滤器:

代码:
<!-- CAS Filters -->
<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://james-huang:8443/cas/login</param-value>
</init-param><!--这里的james-huang是服务端的主机名-->
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://james-huang:8443/cas/proxyValidate</param-value>
</init-param><!--这里的james-huang是服务端的主机名,而且必须是-->
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>client:port</param-value><!--client:port就是需要CAS需要拦截的地址和端口,一般就是Client端的IP和port-->
</init-param>
</filter>

<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这样,重启Client端的Tomcat并访问 http://client-ip:8080/casclient,你就会被重定向到Server端的CAS登陆页;此时你可测试登录(默认的认证Handler只要求username=password,可任意选择用户名);登录后就会进入casclient的欢迎页面了;继续定位到http://client-ip:8080/casclient,执行任何一个例子也不用再输入密码。
至此,全部架设过程及测试完毕。当然,这仅仅是一个测试过程,若要实际环境中我们需要到数据库验证用户有效性,我们必须借助到用户数据库。首先,我们需 要创建自己的数据库验证器,当然也可以使用Jasig提供的cas-server-jdbc.jar,通常我们会修改cas-server- jdbc的源码满足自己的需要,并把mysql的jdbc驱动和修改后的jar部署到%CAS%/WEB_INF/lib/下。具体的过程不在这里赘述, 有兴趣的朋友可以自己研究一下。




5. 补充:1、 在多台机器上部署CAS的时候要注意,这些部署的机器必须在同一个域中。2、若在配置过程中出现一些Exception,像“keytool 别名已存在”这些的出错提示,一般都是由于证书导入未成功造成的,若重新生成证书,导入到客户端的同时别忘了把server端的.keystore文件重 新拷贝到Tomcat中去,石头就是由于忘记了这个步骤还调试了老半天呢:)



cas-asp:
<%
    dim cas_server
    cas_server = "http://midp-117:8080/cas/"
   
    function doCasLogin()
        dim uid,ticket,url,backUrl
       
        uid  = Session.Contents("Netid")
       
        if uid="" then
           
            ticket = Request.QueryString.Item("ticket").Item
           
            if ticket="" then
           
                backUrl = CasUtilGetPageUrl()
                url = cas_server+"login?"+"service="+ backUrl
                   
                Response.Redirect(url)
                Response.End
               
            else
               
                if InStr(Request.QueryString,"&ticket")=0 then
                    backUrl = CasGetValidateBackUrl()
                else
                    backUrl = Split(backUrl,"&ticket")(0)
                end if
               
                set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
               
                url  =cas_server+"validate?ticket="+ticket+"&"+"service="+ backUrl
               
                http.open "GET",url,false
                http.send()
               
'                Response.write("text = " + http.responseText)
               
                if InStr(Request.QueryString,"no")=0 then   '// Logon successful
                   
                    'Response.write(Trim(Split(http.responseText,"yes")(1)))
                    Session.Contents("Netid") = Trim(Split(http.responseText,"yes")(1))
                   
                end if
            end if
        end if
    end function

    ' Utils
   
    function CasUtilGetPageUrl()
   
        dim pageUrl
       
        If Request.ServerVariables("https") = "on" Then
            pageUrl = "https"
        Else
            pageUrl = "http"
        End If
       
        ' TODO : Support https protocol !!
        pageUrl = pageUrl & "://" & Request.ServerVariables("server_name")
       
        If Request.ServerVariables("server_port") <> 80 Then
            pageUrl = pageUrl & ":" & Request.ServerVariables("server_port")
        End if
       
        pageUrl = pageUrl & Request.ServerVariables("path_info")
       
        If Request.QueryString <> "" Then
            pageUrl = pageUrl & "?" & server.URLEncode( Request.QueryString )
        End if
        ' We have the current page URL.
        CasUtilGetPageUrl = pageUrl
       
    end function
   
    function CasGetValidateBackUrl()
   
        dim pageUrl
       
        If Request.ServerVariables("https") = "on" Then
            pageUrl = "https"
        Else
            pageUrl = "http"
        End If
       
        ' TODO : Support https protocol !!
        pageUrl = pageUrl & "://" & Request.ServerVariables("server_name")
       
        If Request.ServerVariables("server_port") <> 80 Then
            pageUrl = pageUrl & ":" & Request.ServerVariables("server_port")
        End if
       
        pageUrl = pageUrl & Request.ServerVariables("path_info")

        CasGetValidateBackUrl = pageUrl
       
    end function
   
   
    doCasLogin()
%>

<!--#include file='cas.asp'-->
<%
'需要登陆页面,嵌入此文件即可
dim userid
userid = Session.Contents("Netid")
'Response.write("text = " +  userid)
%>

介绍:
http://www.360doc.com/showWeb/0/0/222129.aspx

你可能感兴趣的:(tomcat,应用服务器,Web,SSO,Acegi)