1、下载cas-server-3.5.1.war和cas-client-3.1以及tomcat6
2、学习下spring web flow,cas3.5使用了spring webflow做流程转向控制。
1、 生成服务端数字证书
keytool -genkey -v-alias casserver -keyalg RSA -keystore D:/casserver.keystore -dname "CN=cas.server,OU=所属组织,O=所属单位,L=城市,ST=省,C=所在国家" -validity 3650 -storepass password -keypasspassword
(CN不建议使用IP,建议使用计算机名称或域名)
2、 生成客户端数字证书(仅建立双向SSL认证时配置)
下一步是为浏览器生成证书,以便让服务器来验证它。假设文件存放在D:/client.p12,为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:
keytool -genkey -v-alias client -keyalgRSA -storetype PKCS12 –keystoreD:/client.p12 -dname"CN=client,OU=所属组织,O=所属单位,L=城市,ST=省,C=所在国家" -validity 3650 -storepass密码 -keypass密码
-validity为有效期限,目前的设置为10年,keypass用于在导入浏览器时使用的密码,如果密码不正确,则不能正确导入到浏览器。
对应的证书库存放在“D:/client.p12”,客户端的CN可以是任意值。
3、 让服务端相信客户端数字证书(仅建立双向SSL认证时配置)
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:
keytool -export-alias client -keystore D:/client.p12 -storetype PKCS12 -storepass密码 -rfc -file D:/client.cer
通过以上命令,客户端证书就被我们导出到“D:/client.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:
keytool -import-alias client -v -file D:/client.cer -keystore D:/client.keystore -storepass密码
通过list命令查看服务器的证书库,我们可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书
4、 配置Tomcat服务器
打开Tomcat根目录下的/conf/server.xml,找到如下配置段,修改如下:
clientAuth="false" sslProtocol="TLS"
keystoreFile=" D:/casserver.keystore "keystorePass="密码 "
truststoreFile=" D:/casserver.keystore "truststorePass="密码 "
/>
其中,clientAuth指定是否需要验证客户端证书,如果该设置为“false”,则为单向SSL验证,SSL配置可到此结束。如果clientAuth设置为“true”,表示强制双向SSL验证,必须验证客户端证书。如果clientAuth设置为“want”,则表示可以验证客户端证书,但如果客户端没有有效证书,也不强制验证。
5、导入客户端证书(仅建立双向配置时需要)
如果设置了clientAuth="true",则需要强制验证客户端证书。双击“D:/client.p12”即可将证书导入至IE:导入证书后,即可启动Tomcat,用IE进行访问。输入[url]https://IPAdress/[/url] ,https协议默认的访问端口为8443。
6、 部署cas服务端
将下载的cas-server-3.5.1.war重命名为cas.war,并放到tomcat中的webapps文件夹下。启动Tomcat,在浏览器中输入https://localhost:8443/cas就可以进入cas的登陆页面了。
7、 更改CAS服务端的用户信息验证方式
在服务端tomcat中,找到tomcat/webapps/cas/web-inf中的deployerConfigContext.xml,找到
这是CAS默认身份认证,只要用户名和密码相同就可以登录,注释掉。定制自己的认证,替换成
cn.com.wz.encodePasswordHandler是自己编写的继承了AbstractJdbcUsernamePasswordAuthenticationHandler的用户信息验证类。
在这个文件中再添加一个数据源的bean,如下:
同时要把链接自己数据库的ORACLE JAR包资源等,放入项目的LIB目录下。
8、 修改CAS服务端的默认页面
最简单的方式直接修改\webapps\cas\WEB-INF\view\jsp\default\ui下的视图文件
附上自定义验证的类:
/* */ package cn.com.wz;
/* */
/* */ import java.io.PrintStream;
/* */ import java.io.UnsupportedEncodingException;
/* */ import java.security.MessageDigest;
/* */ import java.security.NoSuchAlgorithmException;
/* */ import org.jasig.cas.adaptors.jdbc.AbstractJdbcUsernamePasswordAuthenticationHandler;
/* */ import org.jasig.cas.authentication.handler.AuthenticationException;
/* */ import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
/* */ import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
/* */ import sun.misc.BASE64Encoder;
/* */
/* */ public class encodePasswordHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler
/* */ {
/* */ protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials)
/* */ throws AuthenticationException
/* */ {
/* 21 */ String username = credentials.getUsername();
/* 22 */ String password = credentials.getPassword();
/* 23 */ String savedPassword = (String)getJdbcTemplate().queryForObject("select password from sys_user where user_name=?", String.class, new Object[] { username });
/* 24 */ MessageDigest md = null;
/* */ try {
/* 26 */ md = MessageDigest.getInstance("SHA");
/* 27 */ md.update(password.getBytes("UTF-8"));
/* 28 */ String encodePassword = new BASE64Encoder().encode(md.digest());
/* 29 */ System.out.println("数据库中的密码为" + savedPassword + ";加密后的密码为:" + encodePassword);
/* 30 */ if (encodePassword.equals(savedPassword)) {
/* 31 */ System.out.println("验证成功!");
/* 32 */ return true;
/* */ }
/* 34 */ System.out.println("验证失败!");
/* 35 */ return false;
/* */ }
/* */ catch (NoSuchAlgorithmException e) {
/* 38 */ e.printStackTrace();
/* */ } catch (UnsupportedEncodingException e) {
/* 40 */ e.printStackTrace();
/* */ }
/* */
/* 44 */ return false;
/* */ }
/* */ }