CAS学习笔记(二)

来源:互联网 发布:windows自带数据库 编辑:程序博客网 时间:2024/06/04 19:41

7.2 实验步骤

7.2.1 下载服务端和客户端

7.2.2 在本地创建证书文件(请查看后面的注意事项)

步骤 : 首先进入 cmd, 切换任意盘 : 如E:

输入 : E:\keys>keytool -genkey -alias server -keyalg RSA -keystore server.keystore 回车 === >

然后根据提示向导完成信息的详细填写 :

这里写图片描述

注意事项 :

(1)-alias server 中 server 为生成该证书的名字为 server, 也就是该证书的别名 ;

(2)-keystore server.keystore 中的 server.keystore 为生成的证书文件的名字 ; 存放在 E:\keys盘下的 server.keystore 就是生成的证书文件

(3)然后根据提示信息输入密码 , 两次的秘密都相同 , 这里设置都输入密码 :wufeifei

(4) 接下来为非常关键的一步 : 提示 === >> 你的名字与姓氏是什么 ?
CAS 部署服务器机器中存在的域名,本机使用 localhost 测试 ! ( 实际上是需要在 CAS 客户端服务配置中需要使用的自定义域名名称 , localhost 本身有定义 , 不需要自己再重新添加定义 , 这里我们先使用部署在同一 机器上的 localhost 默认域名 )

7.2.3 导出密钥文件

导出秘钥文件的目的是将该密钥文件导入客户端服务器的 JVM 中 ;
注意事项:必须指明别名 , 默认的别名为 mykey, 这里的别名就是创建证书文件时用-alias server参数指明的别名:server

这里需要用到生成密钥文件的密码 :

1、依然切换 server.keystore 文件所在的 E:\keys 目录下 :

2、输入命令 :
keytool -export -file server.crt -keystore server.keystore -storepass wufeifei -alias server

(这里指定了导出密钥文件的完整名称 :server.crt 指定了使用的证书文件 :server.keystore

证书文件的密码 :wufeifei 证书文件的别名 :server)

这是我们可以看到在E:\keys目录下生成了密钥文件:server.crt

这里写图片描述

7.2.4 为客户端服务器的 JVM 导入密钥文件

因为服务端 CAS 需要和客户端应用程序建立可靠 , 信任的通信 , 所以必须将服务端导出的密钥导文件导入到客户端应用程序服务器的 JVM 中 , 以建立可靠信任的连接通信 ; 这里由于是本机测试 , 可以直接在本机的 JVM 中导入信任密钥文件:

注意 :
1、如果客户端应用部署在不同的计算机上,必须在那一台计算机中导入密钥文件;
2、导入证书的时候最好指明证书的别名 , 便于查看和管理 ; 不指明默认的别名为 :mykey
3、千万注意这里使用的 jre 的安装目录的位置 , 注意这里 tomcat 默认使用的 jre 是单独的 jre 安装目录 , 不是 JDK 安装目录下所包含的 jre 安装目录

步骤如下 :

首先切换到 Jre 的安装目录 : D:\Program Files\jre\lib\security
把上一步中导出的密钥文件复制到该目录下 ,

然后运行命令 :keytool -import -keystore cacerts -storepass changeit -file server.crt -alias server

由于该目录下本身存在 cacerts 密钥文件库 , 本身的密码为 changeit, 所以这里使用密码 changeit, 否则 , 可以自己随意的指定任意的密码;
导入成功之后可以删除复制过来的多余的文件 ,server.crt

这里写图片描述

( 注意 Jre 默认的识别的证书库的文件名为 :cacerts, 不能自己任意指定名称 , 所以这里不能自己定义名称)

此处常见的问题:
java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

原因是没有把证书导入正确的jvm中,myEclipse中也有jre。

7.2.5 应用证书到Web服务器-Tomcat 开启8443端口

在 tomcat6 的安装目录下的 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="HTTP/1.1" SSLEnabled="true"     keystorePass="wufeifei"           keystoreFile="E:/keys/server.keystore"     maxThreads="150" scheme="https" secure="true"      clientAuth="false" sslProtocol="TLS" />

注意,若提示提示:java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
将protocol中的内容换成 org.apache.coyote.http11.Http11Protocol

好了,到此Tomcat的SSL启用完成,现在你可以启动tomcat试一下了,例如本教程输入地址:https://localhost:8443/ 打开

这里写图片描述

选择继续浏览此网站(不推荐)

这里写图片描述

配置成功!

八、 CAS服务器配置

在服务端应用程序中找到 : cas-server-webapp-3.5.2.war
这是 CAS 服务端验证的主要验证服务 , 修改文件名为 :cas.war, 然后将此 war 包部署到 tomcat 的 webapp 目录中 ;

现在可以访问CAS应用了,当然要使用HTTPS加密协议访问,例如本教程地址:https://localhost:8443/cas ,现在打开了CAS服务器的页面输入admin/admin点击登录(CAS默认的验证规则只要用户名和密码相同就通过)所以如果你看到下面的这张图片你就成功了。

这里写图片描述

8.1服务器读取数据库配置

上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。

首先打开
tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml

配置的地方如下:

注释掉:SimpleTestUsernamePasswordAuthenticationHandler这个验证Handler,这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用!

在下面添加下面的代码:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"><property name="dataSource" ref="dataSource"></property><property name="sql" value="select password from user where username=?"></property><property name="passwordEncoder" ref="MD5PasswordEncoder"></property></bean>

在文件的末尾之前加入如下代码:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>   <property name="url"><value>jdbc:mysql:///test</value></property>   <property name="username"><value>root</value></property>   <property name="password"><value>1</value></property></bean><bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">    <constructor-arg index="0">        <value>MD5</value>    </constructor-arg></bean>

复制cas-server-3.5.2\modules\cas-server-support-jdbc-3.5.2.jar和mysql驱动jar包到tomcat/webapp/cas/WEB-INF/lib目录
注意:拷贝代码时注意空格问题

8.2配置解释
QueryDatabaseAuthenticationHandler,是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticationHandler是通过配置一个 SQL 语句查出密码,与所给密码匹配
dataSource,就是使用JDBC查询时的数据源
sql,语句就是查询哪一张表,本例根据user表的username字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是user的表结构:

create table user (
id bigint not null auto_increment,
email varchar(255),
username varchar(255) not null unique,
name varchar(255),
password varchar(255),
primary key (id)
) ENGINE=InnoDB;

passwordEncoder,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可。

九、 CAS客户端配置

9.1解压并添加依赖包

解压客户端 zip 包 , 在其中找到客户端的支持依赖 jar 包 : cas-client-core.jar 以及common-logging.jar( 这个 jar 包是客户端应用服务系统中必须要加入的依赖包 ), 任意新建一个 web 项目 . 例如 web 项目的名字为 yyProject举例 , 首先把这两个 Jar 包复制到该项目的 WEB-INF 目录下的 lib 目录下 。

9.2在该项目的 web.xml 中配置 CAS 过滤器

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置--><listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!-- 该过滤器用于实现单点登出功能,可选配置。 --><filter>    <filter-name>CAS Single Sign Out Filter</filter-name>    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping>    <filter-name>CAS Single Sign Out Filter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责用户的认证工作,必须启用它 --><filter>    <filter-name>CASFilter</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/index</param-value>    </init-param>    <init-param>        <!--这里的server是服务端的IP-->        <param-name>serverName</param-name>        <param-value>https://localhost:8443</param-value>    </init-param></filter><filter-mapping>    <filter-name>CASFilter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责对Ticket的校验工作,必须启用它 --><filter>    <filter-name>CAS Validation Filter</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</param-value>    </init-param>    <init-param>        <param-name>serverName</param-name>        <param-value>https://localhost:8443</param-value>    </init-param></filter><filter-mapping>    <filter-name>CAS Validation Filter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping><!--该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。--><filter>    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>    <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping>    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping><!--该过滤器使得开发者可以通过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 Assertion Thread Local Filter</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>
0 0
原创粉丝点击