首先,CAS客戶端的配置使用最簡單的配置方式,全部配置都放在web.xml文件中。雖然這種配置方式很明瞭,但存在幾個缺點。這種配置方式不僅使web.xml文件顯得臃腫,而且相關屬性的配置不夠靈活,不易於管理。
其次,採用了keytool生成證書。儘管直接藉助於keytool能夠獲得自簽名的X.509證書,但keytool工具不支持簽署其他證書。因此,在需要簽署其他證書的時候,必須使用其他證書管理工具。
鑑於以上問題,本節將採用Spring過濾鏈的配置方式配置CAS Client,將臃腫的配置信息從web.xml中抽取出來,簡化web.xml文件。使用OpenSSL管理證書,以彌補keyool的種種不足。
1.準備環境
操作系統:32位Window XP
CAS服務器:Cas Server 3.3.3
CAS客戶端:Cas Client 3.1.10
Web服務器:Tomcat 6.0.18
數據庫:MySQL 5.0
JDK:jdk1.5.0_10
2.基礎環境準備
JDK安裝後,複製兩份jdk1.5.0_10,分別命名爲jdk_cas和jdk_client。
同樣,複製兩份Tomcat 6.0.18,分別命名爲apache-tomcat-cas和apache-tomcat-client。
配置Tomcat對應的JDK。打開apache-tomcat-cas/bin/catalina.bat文件,在rem Guess CATALINA_HOME if not defined這行之前添加:set JAVA_HOME=您的安裝路徑/jdk_cas,然後保存。同樣方式配置apache-tomcat-client,這樣啓動apache-tomcat-cas將使用jdk_cas,啓動apache-tomcat-client將使用jdk_client。
3.生成證書
OpenSSL工具的安裝配置請參考本系列文章的第1篇,接下來將生成根證書和服務器證書。
創建三個目錄C:/openssl、C:/openssl/root、C:/openssl/server。然後在命令行下進入C:/openssl目錄。
(注:整個過程中涉及到密碼的地方均使用password)
3.1.創建根證書
//創建私鑰
openssl genrsa -out root/root-key.pem 1024
//創建證書請求
openssl req -new -out root/root-req.csr -key root/root-key.pem
//證書信息,按順序輸入,最後一個選項An optional company name直接回車
CN
GuangDong
GuangZhou
JavaEECas
Programmer
root
[email protected]
password
//自簽署根證書
openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650
//將根證書導出成瀏覽器支持的.p12(PKCS12)格式
openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12
3.2.創建服務器證書
//創建私鑰
openssl genrsa -out server/server-key.pem 1024
//創建證書請求
openssl req -new -out server/server-req.csr -key server/server-key.pem
//證書信息
CN
GuangDong
GuangZhou
JavaEECas
Programmer
localhost
[email protected]
password
//簽署服務器證書
openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
//將客戶證書導出成瀏覽器支持的.p12(PKCS12)格式
openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12
4.啓用HTTPS
4.1.在apache-tomcat-cas中啓用HTTPS
打開apache-tomcat-cas/conf/server.xml,在<Connector port=”8080” …/>下面添加以下代碼:
- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" minSpareThreads="2" maxSpareThreads="10"
- scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS"
- keystoreFile="C:/openssl/server/server.p12" keystoreType="PKCS12" keystorePass="password"
- truststoreFile="C:/openssl/root/root.p12" truststoreType="PKCS12" truststorePass="password" />
其中,keystoreFile和truststoreFile根據實際情況進行修改。
4.2.導入證書
爲了使客戶端信任CAS Server,我們必須在客戶端導入根證書。操作步驟:
1、打開Internet選項->證書->受信任的根證書頒發機構->導入->下一步,選擇root.p12文件
2、輸入密碼
3、選擇證書存儲位置
接着“下一步”直到導入成功。
4、查看已導入的證書
4.3.測試HTTPS
啓動Tomcat,訪問https://localhost:8443/,如果能夠看到以下界面,地址欄右邊出現鎖圖標,則說明HTTPS啓用成功。
5.使用RDBMS認證
我們將採用“小螞蟻-CAS單點登錄系列(4)-使用RDBMS認證”一節所使用的cas3作爲CAS認證服務器,將其拷貝到apache-tomcat-cas/webapps目錄下。同時,別忘了把mysql驅動拷貝到cas3/WEB-INF/lib或apache-tomcat-cas/lib目錄下。
重新啓動Tomcat,如果測試使用數據庫認證信息登錄成功,說明CAS認證服務器配置完成。
6.配置客戶端
創建Web應用client3,添加三個包cas-client-core-3.1.10.jar、commons-logging-1.0.4.jar、spring-2.5.6.jar。
6.1.修改apache-tomcat-client端口
總共有三個端口需要修改,分別是默認的Server元素的port="8005"、Connector元素port="8080"、Connector元素port="8009",筆者分別修改爲9005、9090、9009。
6.2.Web.xml配置
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- id="WebApp_ID" version="2.5">
- <display-name>client3.1.10</display-name>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/classes/spring-appContext.xml
- </param-value>
- </context-param>
- <!-- Character Encoding filter -->
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </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.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetBeanName</param-name>
- <param-value>authenticationFilter</param-value>
- </init-param>
- </filter>
- <filter>
- <filter-name>CAS Validation Filter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetBeanName</param-name>
- <param-value>ticketValidationFilter</param-value>
- </init-param>
- </filter>
- <filter>
- <filter-name>CAS HttpServletRequestWrapperFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetBeanName</param-name>
- <param-value>casHttpServletRequestWrapperFilter</param-value>
- </init-param>
- </filter>
- <!-- 使得開發者可以在任意場合使用final Assertion assertion = AssertionHolder.getAssertion() -->
- <filter>
- <filter-name>CAS AssertionThreadLocalFilter</filter-name>
- <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
- </filter>
- <!-- Character Encoding -->
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <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>/secure/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS Validation Filter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS HttpServletRequestWrapperFilter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS AssertionThreadLocalFilter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <listener>
- <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
- </listener>
- </web-app>
6.3.添加資源文件
在類路徑下新建文件cas-client.properties,內容如下:
cas.server.url=https://localhost:8443/cas3
cas.client.serverName=localhost:9090
第一行指定CAS服務器地址,第二行指定客戶端服務名稱,格式爲:主機名:端口號
6.4.添加Spring配置文件
在類路徑下新建文件spring-appContext.xml,內容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
- <!-- 定義環境變量 -->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="ignoreResourceNotFound" value="true" />
- <property name="location" value="classpath:cas-client.properties"/>
- </bean>
- <!-- 認證過濾器配置 -->
- <bean
- name="authenticationFilter"
- class="org.jasig.cas.client.authentication.AuthenticationFilter"
- p:casServerLoginUrl="${cas.server.url}/login"
- p:renew="false"
- p:gateway="false"
- p:serverName="${cas.client.serverName}" />
- <!-- 驗證過濾器配置 -->
- <bean
- name="ticketValidationFilter"
- class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter"
- p:serverName="${cas.client.serverName}">
- <property name="ticketValidator">
- <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
- <constructor-arg index="0" value="${cas.server.url}" />
- </bean>
- </property>
- </bean>
- <!--
- <bean
- name="ticketValidationFilter"
- class="org.jasig.cas.client.validation.Cas10TicketValidationFilter"
- p:serverName="${cas.client.serverName}">
- <property name="ticketValidator">
- <bean class="org.jasig.cas.client.validation.Cas10TicketValidator">
- <constructor-arg index="0" value="${cas.server.url}" />
- </bean>
- </property>
- </bean>
- -->
- <bean id="casHttpServletRequestWrapperFilter"
- class="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"/>
- </beans>
6.5.導入根證書
由於CAS Server啓用了HTTPS,要使Web客戶端信任其身份,必須爲jdk_client導入根證書。
keytool -import -v -trustcacerts -storepass changeit -alias root -file root/root-cert.pem -keystore E:/DevelopTools/JDK/jdk_client/jre/lib/security/cacerts
7.綜合測試
7.1.啓動apache-tomcat-cas
7.2.啓動apache-tomcat-client
7.3.訪問client3
訪問http://localhost:9090/client3/secure/securedpage.jsp頁面,將被引導到CAS登錄頁面。輸入憑證信息,認證通過後將出現以下頁面:
訪問http://localhost:9090/client3/secure/debug.jsp頁面,可以看到通過三種不同的方式獲取用戶名。
在http://localhost:9090/client3/secure/securedpage.jsp頁面中,單擊“退出”鏈接將單點退出系統。
8.可能遇到的問題
8.1報錯:
'unable to find valid certification path to requested target'
原因:
Web應用服務器端沒有導入根證書
解決方法:
在jdk_client導入根證書。
至此,本節內容結束,有遺漏或疏忽的地方請大家指出,謝謝!