原文地址
TOMCAT :tomcat-5.5.15版
JDK:1.5.06
环境变量要设好.
1. 启用TOMCAT的SSL
把.keystore文件复制到TOMCAT的CONF目录下面。
在TOMCAT的主目录的CONF目录下面,修改server.xml文件,加上以下代码
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/.keystore"
keystorePass="changeit"
/>
其中的keystoreFile是证书库文件,keystorePass是访问此证书库文件的密码。
注:keystore文件可以用以下方法生成。
Keytool –genkey –alias hostname –keyalg RSA(在接下来的第一项是名称,记住最好是和hostname同一名称)执行此操作会在用户的当前目录(user.home)下产生一个名为.keystore的文件。如果已经有了,将自动把新产生的KEY放进文件里面(此次的hostname是运行CAS服务器的名字.不要搞错,否则会在以后验证出错的.如果你是在本地测试,则用localhost就OK了)
2. 导入证书文件到各个应用的JRE的JVM里面
首先产生一个证书文件,用以下方法:
Keytool –export –alias hostname –file filename.cer
这样就在用户当前产生了一个名为filename.cer的文件
接下来就把此文件导入到各应用的的JVM里面
Keytool –import –alias hostname –file filename –keystore {java_home}\jre\lib\security\cacerts
注:如果你的JAVA_HOME里面有空格,请用引号括住。
3. 把cas.war包复制到TOMCAT的WEBAPPS下面,然后用http://localhost:8080/cas/login就可以访问登陆了
改写验证方法。CAS的默认方验证方法是用户名和密码相同,如果想改为自己的验证方式,如何做呢?你只需复制以下代码,然后在适当的地方插入你的验证代码就OK了。
package org.jasig.cas.authentication.handler.support;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.springframework.util.StringUtils;
public final class classname extends
AbstractUsernamePasswordAuthenticationHandler {
public boolean authenticateUsernamePasswordInternal(
final UsernamePasswordCredentials credentials) {
final String username = credentials.getUsername();
final String password = credentials.getPassword();
if (在此插入你的验证代码) {
getLog().debug(
"User [" + username + "] was successfully authenticated.");
return true;
}
getLog().debug("User [" + username + "] failed authentication");
return false;
}
protected void afterPropertiesSetInternal() throws Exception {
super.afterPropertiesSetInternal();
getLog()
.warn(
this.getClass().getName()
+ " is only to be used in a testing environment. NEVER enable this in a production environment.");
}
}
然后,修改deployerConfigContext.xml(在CAS的WEB-INF目录下面)
找到
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
把class改为你自己写的验证的类就OK了。
到此,服务器端的配置就完成了。
接下来是各个应用的配置:
4.(以JAVA的配置为例子)把casclient.jar包复制到应用的lib目录下面,如果没有就创建它。然后再在应用的部署描述文件里面(web.xml)加上filter。如下:
<filter>
<filter-name>CAS Filter</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://casServerhost:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https:// casServerhost: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>CAS Filter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
Localhost是指各个应用的服务器的名字
casServerHost是指cas服务器的名字
其中的filter-mapping就是配置哪些资源是需要通过CAS验证的。可以配置多个。
4. 配置语言包
在cas里面的WEB-INF\classes下面添加不同的语言包,然后再在\WEB-INF\view\jsp\default\ui\includes的top.jsp文件顶部加入<%@ page contentType="text/html; charset=gbk" language="java" %>便可以了。
一些错误信息:
1. keytool 认证未输入别名 <mykey> 已经存在
这是因为你已经导入了一信任证书。在进行keytool –import的时候,如果没有指定别名,则系统默任导入的证书的名字为mykey,所以,可以先删除此证书keytool –delete –alias mykey –keystore {java_home}\jre\lib\security\cacerts
然后再从新导入,或者指定别名导入keytool –import –alias name –keystore {java_home}\jre\lib\security\cacerts
2. java.io.IOException: Keystore was tampered with, or password was incorrect
这个很可能你的keystore文件已经被修改了,密码已经更改,直接删除这个文件,再从新生成就可以了
3. javax.servlet.ServletException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
这是因为你没有在应用端导入证书。在应用端执行keytool –import –alias name –file filename.cer便可以。其中的name.cer是在前面的用keytool –export导出的cer文件
如果你的机器有多个Tomcat,当你执行一个Tomcat的startup命令时,它执行的是你希望的那个吗?
我机器有多个Tomcat的目录,因为它不用安装,所以,我就进入到一个Tomcat的bin目录,执行startup.bat,结果发现不对,它执行的是另一个目录下的Tomcat。
后来想明白了,是CATALINA_HOME的问题,不管你执行的是那个目录下的启动命令,而真正执行的是CATALINA_HOME配置的那个Tomcat的命令,或者说startup会寻找CATALINA_HOME配置的目录,启动那个Tomcat。
切记,否则,会被耍得很郁闷......
另外,catalina*.bat文件也很有用,你可以自己编辑这个文件,为它指定JAVA_HOME,这样你就可以不用事先安装JDK或者JRE,自己的程序中打包一个JDK,然后,指定JAVA_HOME为自己的这个JDK的相对路径,然后用安装打包工具,如NSIS,Wise等打包,然后,安装会把这些东西都复制到指定的路径下,你的程序直接执行startup命令就可以了,这样即使用户不懂技术,安装步骤也不复杂。
还有,好像是Tomcat4.1.29开始,Tomcat对Get的处理和Post不再一样,就带来了Tomcat的URIEncoding的问题,具体解决办法是配置URIEncoding="字符集",我忘了从那里看到了,写在这里,如果哪位兄弟知道确切的出处,请告诉我,谢谢!
原文地址