1、 创建证书:
创建文件夹d:\cas\keys,用于存放证书文件(必须先创建文件夹)
以管理员身份运行命令行控制台,进入java的jre\bin目录
cd D:\Software\Java\jre1.8.0_73\bin
执行如下命令:
keytool -genkey -alias castest -keyalg RSA -keysize 2048-keystore d:/cas/keys/castest.keystore
此步完成后会在d:\cas\keys目录中找到castest.keystore
2、 导入证书
继续执行命令:
keytool -export -file d:/cas/keys/castest.crt -aliascastest -keystore d:/cas/keys/castest.keystore
此步完成后可在D:/cas/keys文件夹下找到castest.crt文件
3、 客户端JVM导入证书
进入JDK安装目录
cd D:\Software\Java
执行如下命令:
keytool -import -keystore D:\Software\Java\jre1.8.0_73\lib\security\cacerts -file d:/cas/keys/castest.crt -alias castest
如果要删除证书执行此命令(管理员身份运行):
keytool -delete -alias castest -keystore"%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
查看证书列表: keytool -list -keystoreD:\Software\Java\jre1.8.0_73\lib\security\cacerts
4、 证书应用到tomcat,我这里使用tomcat6.0.29
打开tomcat的conf\server.xml,启用83和87行的注释代码,设置keystoreFile、keystorePass,启用Web服务器(Tomcat)的SSL,也就是HTTPS加密协议
修改后的代码如下:
<Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150"scheme="https" secure="true"
clientAuth="false"sslProtocol="TLS"
keystoreFile="D:/cas/keys/castest.keystore"keystorePass="123456" />
参数说明:
keystoreFile:第一步创建key存放的位置
keystorePass:创建证书时的密码
使用tomcat7及以上,会报错:
java.lang.Exception: Connector attribute SSLCertificateFilemust be defined whe n using SSL with APR
是因为7及以上的多了个dll文件,6的默认使用JSSE实现,而7.0默认使用APR实现。由于习惯使用6.0的配置方式(即JSEE实现),因此只要把conf\server.xml里的protocol修改一下就行了:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"SSLEnabled="true"
maxThreads="150"scheme="https" secure="true"
clientAuth="false"sslProtocol="TLS"
keystoreFile="D:/cas/keys/castest.keystore"keystorePass="123456" />
5、 修改host文件
打开文件C:\Windows\System32\drivers\etc\hosts
第一步设置的域名IP指向。
6、 测试是否成功
启动tomcat,浏览器中输入https://sso.test.com:8443
然后就是tomcat的首页了
7、 CAS Server端配置
下载cas-serve -4.0.0 (http://www.ja-sig.org/downloads/cas/),解压之后进入目录D:\cas-server-4.0.0\modules,复制cas-server-webapp-4.0.0.war到tomcat的webapps目录下,最好改名为cas.war,方便输入URL
在浏览器中输入:https://sso.test.com:8443/cas/login,或者https://localhost:8443/cas/login
看见CAS默认登录页面,
找到配置文件deployerConfigContext.xml的bean:primaryAuthenticationHandler,定义了用户名和密码,可以修改用户名密码,我的如下:
登录成功
8、 更改默认语言
从图中可以看到,上面默认的是英文,我们改成中文。进入D:\apache-tomcat-6.0.29\webapps\cas\WEB-INF\classes,将message.properties重命名message_bak.properties(保留),复制messages_zh_CN.properties,重命名为message.properties,即可。重启tomcat,看到登录页已经是中文。
9、 配置数据库读取用户信息
编辑器打开D:\apache-tomcat-6.0.29\webapps\cas\WEB-INF目录下的deployerConfigContext.xml,
注释掉primaryAuthenticationHandler这个bean,然后配置数据源如下(castest是我用来演示的数据库):
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/castest?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"
p:user="root"
p:password="root" />
<beanid="primaryAuthenticationHandler"
class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
abstract="false"
lazy-init="default"autowire="default" >
<property name="tableUsers">
<value>account</value>
</property>
<property name="fieldUser">
<value>username</value>
</property>
<propertyname="fieldPassword">
<value>password</value>
</property>
<property name="dataSource"ref="dataSource"/>
</bean>
上面的dataSource指定了数据源,需要在lib中加入c3p0-0.9.1.2.jar、mysql-connector-java-5.1.27.jar。
primaryAuthenticationHandler定义了用户验证规则,从dataSource读取表account中的用户数据。username是用户名,可以是其他名字,会映射成默认的“username”, password是密码,也可以是其他名字,会映射成默认的“password”,除了使用SearchModeSearchDatabaseAuthenticationHandler类,还可以使用QueryDatabaseAuthenticationHandler,其验证方式如下:
<beanid="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
<propertyname="dataSource" ref="dataSource"/>
<property name="sql" ref="select password fromaccount where username=? "/>
</bean>
效果跟使用SearchModeSearchDatabaseAuthenticationHandler类是一样的。必须注意,需要导入modules中的cas-server-support-jdbc-4.0.0.jar
然后重启tomcat,可以用数据库中的用户名密码登陆了。
10、 客户端集成sso进行单点登录
下载cas-client-3.3.3-release,下载地址http://www.ja-sig.org/downloads/cas-clients,解压缩文件,在modules目录下找到cas-client-core-3.3.3.jar,复制到需要单点登录的工程的lib目录中,maven工程可以使用如下依赖:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.3.3</version>
</dependency>
然后在web.xml中配置相应的Filter如下:
<!--======================== 单点登录/登出======================== -->
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CAS Authentication Filter</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/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://localhost:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- ======================== 单点登录/登出结束 ======================== -->
将工程打包之后复制到与cas所在的webapps目录下,启动tomcat,访问项目首页,会自动跳转到cas默认的登录页面。
输入正确的用户名和密码之后,报错:
HTTP Status 500 - javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException: No name matching localhost found
如图:
将以上web.xml中“单点登录/登出”内容里的localhost改成sso.test.com,重启tomcat,访问项目登录页,输入用户名密码点击登录后,报如下错误
HTTP Status 500 - javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException: PKIX path building failed:sun.security.provider.certpath.SunCertPathBuilderException: unable to findvalid certification path to requested target
根本原因是:缺乏有效授权的证书。
这篇文章(http://www.java-samples.com/showtutorial.php?tutorialid=210)有教怎么解决,但是试了不行,继续想办法解决!
好了朋友们,在google了大量资料之后,终于想明白一个问题。我是在本机上做练习的,cas和我的工程war包都放在同一个tomcat的webapps目录下,我是直接运行tomcat的startup.bat来运行tomcat的,问题就在这里:
默认情况下,tomcat是使用jdk的,而不是jre,我把证书导入的是jre,这就导致找不到证书啊!
解决方法很简单,在catalina.bat中加入下面一行代码,时tomcat使用jre:
set"JAVA_HOME=D:\Software\Java\jre1.8.0_73"
重启tomcat,运行工程,跳转至登陆页,输入用户名密码,登陆,页面成功跳转。我也是刚接触CAS,希望大家多多互相学习交流,本笔记到此结束。
参考资料:
https://github.com/Jasig/java-cas-client
http://itindex.net/detail/51110-cas-4.0-%E7%99%BB%E5%BD%95
http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
http://flyingsnail.blog.51cto.com/5341669/1565428
http://sgq0085.iteye.com/blog/2003190