CAS的安装与配置

一、搭建Java Web服务器环境 

CATALINA_HOME = D:\Java\apache-tomcat-6.0.14 
安装完毕,启动Tomcat ,在浏览器上 测试 http://localhost:8080/ 
 
出现上述界面,表明系统成功搭建。 

二、使用Java Keytool工具为系统生成HTTPS证书,并为系统注册

1.  删除已有

C:\Program Files\Java\jdk1.6.0_10\bin>keytool -delete -alias tomcat(随意起的别名) -keystore D:/Java/jdk1.6.0_33/jre/lib/security/cacerts -storepass changeit

2. 生成密匙库

输入密钥密码和相应参数,(注意:第一个参数CN要输入域名sso.shipengzhi.com,其他参数就随便了),结果是在用户目录中创建了名为server.keystore的密钥文件。

C:\Program Files\Java\jdk1.6.0_10\bin>keytool -genkey -alias tomcat -keypass changeit -keyalg RSA -keystore server.keystore(密钥文件名)    

在当前目录下多出一个文件server.keystore 

3. 导出数字证书

C:\Program Files\Java\jdk1.6.0_10\bin>keytool -export -alias tomcat -keypass changeit -file server.crt -keystore server.keystore

输入keystore密码:changeit

输入上一步中的密码,结果在当前目录生成server.crt密钥文件。(注意:这个文件是要导入客户端的JVM上的) 

4.将数字认证导入jre可信任区

C:\Program Files\Java\jdk1.6.0_10\bin>keytool -import -alias tomcat -file server.crt -keypass changeit -keystore D:/Java/jdk1.6.0_33/jre/lib/security/cacerts

这里的jre地址和tomcat使用的jre必须一致

输入密码(注意:这里的密码不是上面设定的密码,而是changeit),将创建cacerts文件。

 

5. 查看可信证书列表(检查证书是否加入成功)

C:\Program Files\Java\jdk1.6.0_10\bin>keytool -list -keystore D:\Java\jdk1.6.0_33/jre/lib/security/cacerts

6.命令解释(转)

-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书

-alias 产生别名

-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中

-keyalg 指定密钥的算法

-validity 指定创建的证书有效期多少天

-keysize 指定密钥长度

-storepass 指定密钥库的密码

-keypass 指定别名条目的密码

-dname 指定证书拥有者信息例如: "CN=firstName,OU=org,O=bj,L=bj,ST=gd,C=cn"

-list 显示密钥库中的证书信息 keytool -list -v -keystore 别名 -storepass ....

-v 显示密钥库中的证书详细信息

-export 将别名指定的证书导出到文件 keytool -export -alias 别名 -file 文件名.crt

-file 参数指定导出到文件的文件名

-delete 删除密钥库中某条目 keytool -delete -alias 别名 -keystore sage

-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 别名 -keypass .... -new .... -storepass ... -keystore 别名

-import 将已签名数字证书导入密钥库 keytool -import -alias 别名 -keystore 证书名-file 文件名(可以加.crt 后缀)

 

以上是服务器端导入证书,放在tomcat用的jre下的证书库中

 

三、配置Tomcat的HTTPS服务 

在tomcat的server.xml中添加配置信息 

<Connector protocol="org.apache.coyote.http11.Http11Protocol" 
port="8443" minSpareThreads="5" maxSpareThreads="75" 
enableLookups="true" disableUploadTimeout="true" 
acceptCount="100" maxThreads="200" 
scheme="https" secure="true" SSLEnabled="true" 
keystoreFile="C:/Users/shipengzhi/server.keystore" keystorePass="changeit" 
truststoreFile="D:/Java/jdk1.6.0_33/jre/lib/security/cacerts" 
clientAuth="false" sslProtocol="TLS"/>

keystorePass="changeit"参数,即为上面几步中涉及到的密 码,keystoreFile=".keystorePath",.keystorePath即为在第一步中生成的文件.keystore的全路径,如: C:/Users/shipengzhi/server.keystore。

 

绑定hosts
10.1.164.118 sso.shipengzhi.com

启动Tomcat,访问https://localhost:8443/,出现以下界面说明HTTPS配置生效: 

 

四、构建CAS服务器和过滤器

1.部署JA-SIG(CAS)服务器 

cas官方网站

http://www.jasig.org/cas

下载最新的服务端 CAS Server 3.5.0 Final

解压后将modules下面的cas-server-webapp-3.3.3.war改名为cas.war部署到web服务器,作为单点登录的服务器。

启动Tomcat,访问网址http://localhost:8080/cas/index.jsp或https://localhost:8443,出现以下画面: 
 
输入用户名/密码 :linly/linly(任意两个相同的字窜),点击“登录”,出现以下画面: 
 
表示CAS服务器配置运行成功。 

2.为HelloWorldExample程序配置CAS过滤器 

访问http://shipengzhi:8080/examples/servlets/servlet/HelloWorldExample,出现以下界面说明应用正常启动: 
 
编辑D:\Java\apache-tomcat-6.0.14\webapps\examples\WEB-INF下的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>CASFilter</filter-name>
  <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
  <init-param>
    <param-name>casServerLoginUrl</param-name>
    <param-value>https://sso.shipengzhi.com:8443/cas/login</param-value>
    <!--这里的server是服务端的IP-->
  </init-param>
  <init-param>
    <param-name>serverName</param-name>
    <param-value>http://localhost:8080</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CASFilter</filter-name>
  <url-pattern>/*</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.shipengzhi.com:8443/cas</param-value>
  </init-param>
  <init-param>
    <param-name>serverName</param-name>
    <param-value>http://localhost:8080</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CAS Validation Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== 单点登录结束 ======================== -->


拷贝
cas-client-core-3.2.1.jar,commons-logging-1.1.jar文件到目录D:\Java\apache-tomcat-6.0.14\webapps\examples\WEB-INF\lib下。 

启动Tomcat。 
测试使用浏览器登陆以下网址:http://shipengzhi:8080/examples/servlets/servlet/HelloWorldExample,页面将弹出以下认证框,点击“确定” 
 

页面将重定向到JA-SIG的SSO登录认证页面 

 

输入用户名=密码,如:linly/linly,则通过验证,进入应用的入口界面,如下: 
 

细心的用户将发现,此时的URL不再是: 
http://shipengzhi:8080/examples/servlets/servlet/HelloWorldExample, 
URL的尾端带上了一个ticket参数: 
http://linly:8080/examples/servlets/servlet/HelloWorldExample?ticket=ST-2-qTcfDrdFb0bWndWgaqZD 
到此,JA-SIG(CAS)服务器的初步SSO部署宣告成功。 

 异常Q&A

1.验证ticket时,抛出异常

avax.servlet.ServletException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

 解决办法:

 tomact使用的jvm的jre必须和数字认证导入jre可信任区时的jre一样,抛出这个异常就是因为不一样导致的。

2.如何将CAS和应用分布部署在不同的机器?

机器A: 部署CAS服务 
机器B: 部署OA应用 
机器C: 用户浏览器端 

1.由机器A上生成.keystore的证书文件,证书颁发者是机器A的完全域名 
2.机器A上用于部署CAS的Tomcat的server.xml文件中定义HTTPS的配置,指向.keystore文件证书 

3.从.keystore中导出的凭证文件要copy到机器B上,并导入机器B的JRE环境的证书库中 

4.机器B上部署OA的Tomcat必须指定运行在导入凭证JRE环境上,而不是JDK,这点常有人搞错。 


五、扩展认证接口(JDBC)

当然,在实际使用的时候,这样做肯定是不行的,还需要根据实际概况做扩展和定制,最主要的是扩展认证 (Authentication) 接口和 CAS Server 的界面。我们通常都会使用jdbc连接数据库进行认证,这种情况,用户名和密码被保存在数据库的某个表中。需要进行如下配置。

在MySQL数据库下创建一个叫做CAS的数据,然后在该数据库中创建一张app_user表,然后在这张表中插入数据,创建表和插入记录的sql脚本如下:

复制代码
CREATE TABLE `app_user` (  
  `username` varchar(30) NOT NULL default '',  
  `password` varchar(45) NOT NULL default '',  
  PRIMARY KEY  (`username`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
--并添加如下用户:  
INSERT INTO `app_user` (`username`,`password`) VALUES   
 ('test','111'),  
 ('user','222'),  
 ('tom','333'),  
 ('jim','000'); 
复制代码

用编辑器打开%CATALINA_HOME%/webapps/cas/WEBINF/deployerConfigContext.xml,找到

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

将其注释掉,然后在同一级别下面添加一个bean,其内容如下所示:

复制代码
            <!--
                <bean 
                    class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
                -->    
                <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> 
                    <property name="sql" value="select password from app_user where username=?" /> 
                    <property name="dataSource" ref="dataSource" /> 
                 </bean>     
复制代码

然后在添加一个bean,这个bean是跟authenticationManager同一级别的,注意这个很重要,这个bean不是跟之前那个bean class同级。其内容如下:

复制代码
<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://localhost:3306/cas</value></property> 
                    <property name="username"><value>root</value></property> 
                    <property name="password"><value>root</value></property> 
                </bean> 
复制代码

如果不想单独再创建一个bean id的话,可以通过通过如下配置完成,并且这个bean使用了密码校验,可以从数据表user中查询用户密码,并对密码进行MD5加密校验,这个认证器位于cas-server-support-jdbc包中。

复制代码
    <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                    <property name="dataSource">
                        <bean id="dataSource"
                            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                            <property name="url" value="jdbc:mysql://localhost:3306/cas?useUnicode=true&amp;characterEncoding=utf-8" />
                            <property name="username" value="root" />
                            <property name="password" value="root" />
                        </bean>
                    </property>
                    <property name="sql" value="select password from app_user where username=?" />
                    <property name="passwordEncoder">
                        <bean class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
                            <constructor-arg value="MD5" />
                        </bean>
                    </property>
                </bean>                
复制代码

然后从\cas-server-3.5.2-release\cas-server-3.5.2\modules目录下拷贝cas-server-support-jdbc-3.5.2.jar,再下载mysql-connector-java-5.1.26-bin.jar,将这两个文件拷贝到%CATALINA_HOME%/webapps/cas/WEB-INF/lib目录下。

此时在登录https://localhost:8443/cas,然后使用jim/000,test/111,tom/333,user/222,test/test,test/1234,可以发现,前面四组是可以通过验证的,而后面两组验证失败。通过验证以后,再次登陆https://localhost:8443/cas,会提示已经登录,此时如果要注销,可以在输入:https://localhost:8443/cas/logout

在配置文件中可以看到,这里的认证器配置的是一个list,默认情况下,只要有一个认证器通过认证,就认为是合法的用户,建议选择合适的认证器放在最前面。比如说,如果不注释之前的SimpleTestUsernamePasswordAuthenticationHandler这个认证器。


猜你喜欢

转载自blog.csdn.net/zhangjunli/article/details/80885422