tomcat ssl配置以及CAS单点登录探究

CAS单点登录需要tomcat配置ssl认证,配置方式如下:
        1,dos进入进入tomcat安装路径的bin目录,输入
keytool -genkey -alias   tomcat -keyalg RSA -keypass changeit -storepass changeit -
keystore server.keystore -validity 3600。此时会在bin下面生成一个
server.keystore
文件。Validity代表天数。在接下来会让你填写姓名,其实就是你服务器的域名,注意,这里用ip是不行的,需要用服务器域名或者计算机全名。其他可以随便填写。
        2,继续输入
keytool -export -trustcacerts -alias tomcat -file server.cer -keystore  server.keystore -storepass changeit
,导出证书,会在bin下面生成一个server.cer文件。
        有了证书后,需要将它导入到jdk证书信任库,继续输入
keytool -import -trustcacerts -alias tomcat -file server.cer -keystore  %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
。也就是说要在cacerts里面添加一个这样的证书,可以通过下面的命令得到证书信任列表:    keytool -list -v -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts。注意一点就是,我们一般把jdk放在C:\Program Files\java下,我试了一下不行,可能是有空格的原因,我的是直接放在c盘下的java文件夹中。当然也可以删除导入的证书,命令:
keytool -delete -alias tomcatsso -keystore cacerts -keypass changeit
假如提示密码 默认是changeit。
       3,最后修改tomca conf下的server.xml。它里面有一段屏蔽的代码如下
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"   
               maxThreads="150" scheme="https" secure="true"   
               clientAuth="false" sslProtocol="TLS" />

改变如下:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
                keystorePass="changeit" keystoreFile="D:\apache-tomcat-6.0.26\bin\server.keystore"
			   />
这里注意的就是keystoreFile是你刚才生成的server.keystore。还就是protocol需要改成Http11Protocol的,不然会报错(网上有的是没有改的,但是不改我这里报错,改就好)。
         4,最后启动https://localhost:8443/,可以看到浏览器地址栏有警告窗口,说明ssl配置成功。
         5,然后需要cas的服务器和客户端 下载地址分别是:
     http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip
http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip
解压server包,把modules文件夹里面的cas-server-webapp-3.1.1.war 改名cas.war放入tomcat的下面,启动浏览,会出现server的界面,部署成功了。


一般的我们会把帐号密码放在数据库中,那么需要在webinf下面的deployerConfigContext文件中配置数据源
 
 <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
     <property name="driverClassName">
          <value>com.mysql.jdbc.Driver</value>
     </property>
     <property name="url">
          <value>jdbc:mysql://localhost:3306/test??useUnicode=true&amp;characterEncoding=utf8</value>
     </property>
     <property name="username">
          <value>root</value>
     </property>
     <property name="password">
          <value>root</value>
     </property>
</bean>
很明显,是spring实现。

AuthenticationHandler是个很重要的概念,表明你验证处理的方式,默认的是使用SimpleTestUsernamePasswordAuthenticationHandler,我们可以改这个注入的类,比如QueryDatabaseAuthenticationHandler或者SearchModeSearchDatabaseAuthenticationHandler。前者可用sql来查询,后者的方式如下:
<bean id="SearchModeSearchDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
                      abstract="false" lazy-init="default"   autowire="default" dependency-check="default">
					    <property  name="tableUsers">
                              <value>userinfo</value>
                        </property>
                        <property name="fieldUser">
                              <value>userName</value>
                        </property>
                        <property name="fieldPassword">
                              <value>password</value>
                        </property>
                        <property name="dataSource" ref="casDataSource" />
               </bean>
即给出表和表中代表帐号密码的字段,来匹配。这个时候启动,并输入你的帐号密码,可以提示成功或失败。

         6,客户端程序(java web) ,你只需要把web.xml配置一下,如下:
<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://casserver:8443/cas/login</param-value>

		</init-param>

		<init-param>

			<param-name>
				edu.yale.its.tp.cas.client.filter.validateUrl
			</param-name>

			<param-value>
				https:// casserver:8443/cas/serviceValidate
			</param-value>

		</init-param>

		<init-param>

			<param-name>
				edu.yale.its.tp.cas.client.filter.serverName
			</param-name>

			<param-value>computerTest:8080</param-value>

		</init-param>

		<init-param>

			<param-name>
				edu.yale.its.tp.cas.client.filter.wrapRequest
			</param-name>

			<param-value>true</param-value>

		</init-param>

	</filter>

	<filter-mapping>

		<filter-name>CAS Filter</filter-name>

		<url-pattern>/test/*</url-pattern>

	</filter-mapping>
Casserver 代表服务器程序的计算机名或者域名。
computerTest代表客户端程序的计算机名或者域名。上面的代表cas服务器。显然,cas是通过过滤器保护你的资源。
          7, 一般情况下,我们几乎不能保证你需要继承的系统都是在一个服务器上,假如对于分布在多个机器上的项目,有几点需要注意,一是你必须保证你cas服务器所在的机器能够用计算机名(或域名访问到)(不能的话另见局域网内不能通过计算机名访问的解决办法.doc)。二是,在客户端服务器(tomcat)中也需要配置ssl,配置方法就是把上面生成的证书导入到jdk中,并且要和cas服务器进行ssl握手,握手方式如下:java InstallCert casserver:8443,接下来的选择项中输入1,搞定。

    以上是今天研究的一点成果,特别是配置的时候有种让人抓狂的感觉,感觉有点凌乱,但是按照这个步骤搞,肯定是没什么问题的。



By 阿飞哥 转载请说明
腾讯微博: http://t.qq.com/duyunfeiRoom
新浪微博: http://weibo.com/u/1766094735

猜你喜欢

转载自duyunfei.iteye.com/blog/1096714