單點登錄系列之五---簡單實施SSO之二

在本系列文章的第3篇中,講解了使用CAS實施單點登錄的簡單過程。

  首先,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_casjdk_client
  同樣,複製兩份Tomcat 6.0.18,分別命名爲apache-tomcat-casapache-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” …/>下面添加以下代碼:

Xml代碼 收藏代碼
  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
  2. maxThreads="150" minSpareThreads="2" maxSpareThreads="10"
  3. scheme="https" secure="true"
  4. clientAuth="false" sslProtocol="TLS"
  5. keystoreFile="C:/openssl/server/server.p12" keystoreType="PKCS12" keystorePass="password"
  6. 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代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">

  6. <display-name>client3.1.10</display-name>

  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>
  10. /WEB-INF/classes/spring-appContext.xml
  11. </param-value>
  12. </context-param>

  13. <!-- Character Encoding filter -->
  14. <filter>
  15. <filter-name>encodingFilter</filter-name>
  16. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  17. <init-param>
  18. <param-name>encoding</param-name>
  19. <param-value>UTF-8</param-value>
  20. </init-param>
  21. <init-param>
  22. <param-name>forceEncoding</param-name>
  23. <param-value>true</param-value>
  24. </init-param>
  25. </filter>

  26. <filter>
  27. <filter-name>CAS Single Sign Out Filter</filter-name>
  28. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  29. </filter>

  30. <filter>
  31. <filter-name>CAS Authentication Filter</filter-name>
  32. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  33. <init-param>
  34. <param-name>targetBeanName</param-name>
  35. <param-value>authenticationFilter</param-value>
  36. </init-param>
  37. </filter>

  38. <filter>
  39. <filter-name>CAS Validation Filter</filter-name>
  40. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  41. <init-param>
  42. <param-name>targetBeanName</param-name>
  43. <param-value>ticketValidationFilter</param-value>
  44. </init-param>
  45. </filter>

  46. <filter>
  47. <filter-name>CAS HttpServletRequestWrapperFilter</filter-name>
  48. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  49. <init-param>
  50. <param-name>targetBeanName</param-name>
  51. <param-value>casHttpServletRequestWrapperFilter</param-value>
  52. </init-param>
  53. </filter>

  54. <!-- 使得開發者可以在任意場合使用final Assertion assertion = AssertionHolder.getAssertion() -->
  55. <filter>
  56. <filter-name>CAS AssertionThreadLocalFilter</filter-name>
  57. <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  58. </filter>

  59. <!-- Character Encoding -->
  60. <filter-mapping>
  61. <filter-name>encodingFilter</filter-name>
  62. <url-pattern>/*</url-pattern>
  63. </filter-mapping>

  64. <filter-mapping>
  65. <filter-name>CAS Single Sign Out Filter</filter-name>
  66. <url-pattern>/*</url-pattern>
  67. </filter-mapping>

  68. <filter-mapping>
  69. <filter-name>CAS Authentication Filter</filter-name>
  70. <url-pattern>/secure/*</url-pattern>
  71. </filter-mapping>

  72. <filter-mapping>
  73. <filter-name>CAS Validation Filter</filter-name>
  74. <url-pattern>/secure/*</url-pattern>
  75. </filter-mapping>

  76. <filter-mapping>
  77. <filter-name>CAS HttpServletRequestWrapperFilter</filter-name>
  78. <url-pattern>/secure/*</url-pattern>
  79. </filter-mapping>

  80. <filter-mapping>
  81. <filter-name>CAS AssertionThreadLocalFilter</filter-name>
  82. <url-pattern>/secure/*</url-pattern>
  83. </filter-mapping>

  84. <listener>
  85. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  86. </listener>

  87. <listener>
  88. <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  89. </listener>

  90. </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代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

  7. <!-- 定義環境變量 -->
  8. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  9. <property name="ignoreResourceNotFound" value="true" />
  10. <property name="location" value="classpath:cas-client.properties"/>
  11. </bean>

  12. <!-- 認證過濾器配置 -->
  13. <bean
  14. name="authenticationFilter"
  15. class="org.jasig.cas.client.authentication.AuthenticationFilter"
  16. p:casServerLoginUrl="${cas.server.url}/login"
  17. p:renew="false"
  18. p:gateway="false"
  19. p:serverName="${cas.client.serverName}" />

  20. <!-- 驗證過濾器配置 -->
  21. <bean
  22. name="ticketValidationFilter"
  23. class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter"
  24. p:serverName="${cas.client.serverName}">
  25. <property name="ticketValidator">
  26. <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
  27. <constructor-arg index="0" value="${cas.server.url}" />
  28. </bean>
  29. </property>
  30. </bean>

  31. <!--
  32. <bean
  33. name="ticketValidationFilter"
  34. class="org.jasig.cas.client.validation.Cas10TicketValidationFilter"
  35. p:serverName="${cas.client.serverName}">
  36. <property name="ticketValidator">
  37. <bean class="org.jasig.cas.client.validation.Cas10TicketValidator">
  38. <constructor-arg index="0" value="${cas.server.url}" />
  39. </bean>
  40. </property>
  41. </bean>
  42. -->

  43. <bean id="casHttpServletRequestWrapperFilter"
  44. class="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"/>
  45. </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導入根證書。

至此,本節內容結束,有遺漏或疏忽的地方請大家指出,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章