环境:
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。