Yale CAS Server的部署及cas-java-client 3.2的应用

环境:
tomcat7.05
cas-server-3.4.5
cas-client-3.2.0

一 . 证书实践

1.生成keystore
keytool -genkey -alias cas -keypass changeit -storepass changeit -keyalg RSA -validity 3600 -dname "CN= localhost, OU=KENNY, O=KENNY" -keystore cas.keystore

注意CN的填写,必须是访问的域名。因为是SSL,所以对域名要求比较严格。


2.查看当前JRE的keystore,输出到t.txt中
keytool -list -v -keystore %java_home%/jre/lib/security/cacerts > t.txt

3.删除证书
keytool -delete -alias cas -keystore %java_home%/jre/lib/security/cacerts -keypass changeit

4.导出crt
keytool -export -alias cas -keypass changeit -file cas.crt -keystore cas.keystore

5.导入证书到JRE
keytool -import -alias cas -file cas.crt -keypass changeit -keystore %java_home%/jre/lib/security/cacerts

    再提醒一次:
①.生成数字证书的时候必须使用主机名或者域名作为证书名称(CN),
     例如sso.example.com(CN=sso.example.com, OU=example, O=example, L=beijing, ST=beijing, C=china)
②.检查JAVA_HOME环境变量(echo $JAVA_HOME),确认tomcat使用了那一个jre(有时候一台机器上会有多个jre),需要将生成的证书文件导入至web服务器使用的那个jre的信任证书列表中,可以使用keytool -list命令检查证书是否导入成功。

二.配置tomcat使用HTTPS

把cas.keystore文件放到tomcat的conf目录下

然后打开tomcat目录下 conf/server.xml文件

查找
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
默认这一段是注释的,去掉注释符号然后修改为以下

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" keystorePass="changeit" keystoreFile="conf/cas.keystore"
           	maxThreads="150" scheme="https" secure="true" 
           	   enableLookups="false" disableUploadTimeout="true"
           	   acceptCount="100"
           	clientAuth="false" sslProtocol="TLS" />


启动tomcat,访问 https://localhost:8443/ 测试是否正常。

勿忘把证书导入到JRE当中,参考第一点的说明。


三.部署CAS-Server

解压CAS-server包
拷贝 modules/cas-server-webapp-VERSION.war 到tomcat下的webapps目录
若tomcat已启动会自动解压部署

访问
http://localhost:8080/cas-server/login 测试是否正常,同样可以使用https

四.测试CAS-Client,集成子系统

同样,这个跟网上的一些例子一样。拿tomcat webapps目录下的examples为子系统做例子。

原理很简单,examples项目原来不用登陆的,现在需加上统一验证。最简单的方法当然就是加一个filter,跟普遍应用中的权限功能差不多,并且耦合度低。所有请求都拦截下来先去filter里面处理验证权限信息,若原系统已经有权限系统的话,做的就是跟CAS-SERVER交互后获取子系统中客户端账号的权限到上下文中。

首先把cas-client-core.jar导入项目的lib中,其中记得把依赖包jakarta commos-logging.jar一并导入。

打开web.xml

添加如下filter的配置
<!-- CAS configure Begin -->
<filter>
 	<filter-name>CasSingleSignOutFilter</filter-name>
 	<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>

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

<listener>
 	<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

<filter>
 	<filter-name>CasAuthenticationFilter</filter-name>
 	<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
 	<init-param>
      	<param-name>casServerLoginUrl</param-name>
      	<param-value>https://localhost:8443/cas-server/login</param-value>
 	</init-param>
 	<init-param>
      	<param-name>serverName</param-name>
      	<param-value>https://localhost:8443</param-value>
 	</init-param>
	<init-param>
      	<param-name>renew</param-name>
      	<param-value>false</param-value>
 	</init-param>
</filter>

<filter-mapping>
 	<filter-name>CasAuthenticationFilter</filter-name>
 	<!-- 过滤器保护的URL,如果能访问这个保护的URL,表示经过CAS验证,可以做获取权限的操作。-->
 	<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
 	<filter-name>CasValidationFilter</filter-name>
 	<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
 	<init-param>
      	<param-name>casServerUrlPrefix</param-name>
      	<param-value>https://localhost:8443/cas-server/</param-value>
 	</init-param>
 	<init-param>
      	<param-name>serverName</param-name>
      	<param-value>https://localhost:8443</param-value>
 	</init-param>
 	<init-param>
      	<param-name>redirectAfterValidation</param-name>
      	<param-value>true</param-value>
 	</init-param>
</filter>

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

<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>

<!-- CAS configure End -->


其中注意红色的域名,由于证书生成的时的域名不同,将影响到这里跳转登录是否能访问子系统。

后记:
1、发生了不少次"No subject alternative names present"的问题。几个月前试过把client源码中触发的代码改掉,暂时不进行验证,因为想着调试的关系才出现的问题,现在想起都好笑。经测试后发现创建证书时,域名用127.0.0.1是不行的,就算web.xml里面匹配了127.0.0.1同样报错,而用localhost的话就正常。

2、CAS filter的配置改动比较大,之前学的和网上大多例子都沿用2.1版本的client及server,还一大堆写着edu.yale的classes。就连官网的wiki也一样是2.1版本的demo,还好依葫芦画瓢看到官网上有其他新的3.1配置参考。


附件说明:
web.rar为tomcat中examples项目中的web.xml文件,加入了CAS filter。
server.rar为tomcat/conf目录下的server.xml文件,参考配置SSL。

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