單點登錄(SSO)、CAS介紹

1.引言

1.1 編寫目的

       記錄使用CAS實現SSO的過程。

1.2 術語定義

CAS: 全稱JA-SIG Central Authentication Service,實現SSO的開源項目。

SSO: 即Single sign on,單點登錄

1.3 所需安裝文件清單

     密鑰庫文件: cas.com.keystore(此文件包已經在安裝包中提供,用戶可以根據製作服務器安全證書環節描述自行生成)

     密鑰證書:   case.com.crt(此文件包已經在安裝包中提供,用戶可根據製作服務器安全證書環節描述自行生成)。

     CAS服務安裝包:cas.war

1.4 軟件環境

JDK1.5+

Tomcat6.x(之前配置用版本5的沒有成功,後來換成6的就可以了)

WindowsXP

MySQL5+

2.概述

2.1 背景

單點登錄(Single Sign On,簡稱SSO)是目前比較流行的服務於企業業務整合的解決方案之一,SSO使得在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。CAS(Central Authentication Service)是一款不錯的針對Web應用的單點登錄框架,這裏就說說使用CAS實現SSO的方式。 

2.2CAS原理和協議

    單點登錄的原理是通過攔截你設定的URL,並跳轉到你指定的CAS Server登錄頁,當你登錄成功後,呆着Ticket,返回到你打開的URL.然後你就可以一票在手,暢通無阻。

    從結構上看,CAS包含兩個部分:CAS Server 和CAS Client需要獨立部署,主要負責對用戶的認證工作;CAS Client負責處理對客戶端受保護資源的訪問請求,需要登錄時,重定向到CAS Server.圖1是CAS最基本的協議過程:

CAS Client 與受保護的客戶端應用部署在一起,Filter方式保護Web 應用的受保護資源,過濾從客戶端過來的每一個Web 請求,同時, CAS Client會分析HTTP請求中是否包請求 Service Ticket(上圖中的 Ticket) ,如果沒有,則說明該用戶是沒有經過認證的,於是,CAS Client會重定向用戶請求到CAS ServerStep 2 )。 Step 3是用戶認證過程,如果用戶提供了正確的CredentialsCAS Server 會產生一個隨機的Service Ticket ,然後,緩存該Ticket ,並且重定向用戶到CAS Client(附帶剛纔產生的Service Ticket),Service Ticket 是不可以僞造的,最後,Step 5 Step6 CAS Client CAS Server之間完成了一個對用戶的身份覈實,用Ticket查到Username ,因爲 Ticket CAS Server產生的,因此,所以 CAS Server的判斷是毋庸置疑的。

      該協議完成了一個很簡單的任務,所有與CAS的交互均採用SSL協議,確保ST和TGC的安全性。協議工作過程會有2此重定向過程,但是CAS Client與CAS Server之間進行ticket驗證的過程對於用戶是透明的。

 

3.安裝步驟

3.1系統環境安裝

3.1.1 JDK安裝

配置環境變量:JAVA_HOME=c:\Program File\Java\jdk1.6.0_06

               Path=%JAVA_HOME\bin

               CALSS=.;%JAVA_HOME\lib\tools.jar;%JAVA_HOME\lib\dt.jar

3.1.2MySQL安裝

MySQL安裝,建庫和建一張users表,包含account,password字段,數據自行建立。

注意:如果password是採用MD5加密,表中password字段數據相應也應是MD5加密。

3.1.3 Tomcat安裝

Tomcat的安裝需要注意,安裝路徑中不能有空格存在。

3.1.4 SSL安全連接配置

集中操作維護需要用到SSL安全連接,其中women需要配置Tomcat的8443端口(如用Oracle,則Tomcat爲7443或6443端口,端口與必須以443結尾)

3.1.4.1  製作服務器安全證書

keytool爲JDK自帶的證書管理工具,我們使用keytool進行證書的生成以及管理,詳細步驟如下:

生成一對密鑰並存儲在密鑰庫裏:打開命令行窗口執行命令keytool -genkey -alias cas.com -keyalg RSA -keystore cas.com.keystore,命令執行成功,屏顯信息類似下面表格中內容.

*-genkey參數爲生成一對密鑰

*-alias爲此密鑰對命名別名,這個需要記住,下一步到處證書的時候需要這個是一項必要參數(即要說明從哪個密鑰庫裏導出證書)。

*-keyalg RSA指的是採用RSA算法

*-keystore是指生成的證書存儲的位置

*密碼輸入後會讓你輸入一些其他信息,記得這裏第一個姓名必須是服務器的域名或者完整的計算機名稱。

*其中的-dname即爲證書的唯一名稱,選項中的cn參數爲CAS服務器所在機器的域名或計算機名,CAS建議不要使用IP名,這個很重要,我們這裏sso.cas.com,那麼在集成了CAS服務的系統中需要添加一條域名與IP的映射信息,剩餘ou/o/c分別爲單位/組織/國家信息,根據實際情況填寫即可。

*-keypass爲證書密碼;-keystore爲密鑰庫文件名;-storepass爲密鑰庫的密碼;validity爲此證書有效期。

 c:\admin>keytool -genkey -dname "cn=sso.cas.com,ou=cas,o=cas,c=CN" -alias cas.com -keypass 123456 -keystore cas.com.keystore -storepass 123456 -validity 180

c:\admin>dir \find "cas.com.keystore"

2011-12-21 18:32 1173 cas.com.keystore

 命令執行成功後將在當前目錄生成cas.com.keystore文件,參見上方表格中得內容。

如果未能執行成功,可能是JDK環境變量配置不正確。

導出證書,在港口的命令窗口執行如下命令

*-export 就是說明要到處證書。

*-file 是指明要從哪個密鑰庫裏導出,我們這裏配置剛纔在上一步生成的cas.com.keystore文件。

*-storepass即爲我們上步中填寫的-storepass 這裏爲123456

*-alias爲此證書的別名

  c:\admin>keytool -export -file cas.com.crt -keystore cas.com.keystore -storepass 123456 -alias cas.com

保存在文件中的認證<cas.com.crt>

爲客戶端的JVM導入密鑰

  c:\admin>keytool -import -file cas.com.crt -alias cas.com.keystore c:/Program Files/Java/jdk1.6.0_06/jre/lib/security/cacerts

輸入密碼: changeit ,這個是默認密碼。

  特別說明這個JDK路徑是指的JDK的JRE路徑下的lib目錄。

如果有產生不需要的證書導入到了cacerts,可以刪除該證書

  c:\admin>keytool -delete -alias cas.com -keystore cacerts

3.1.4.2配置HOST c:/windows/system32/drivers/etc/hosts

  127.0.0.1  cas.com.keystore

3.1.4.3 修改tomcat配置文件:/conf/server.xml

 <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->

<Connector SSLEnabled="true" clientauth="false" keystoreFile="conf/cas.com.keystore" keystorePass="123456" maxThreads="150"

                     port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS" />

3.2配置CAS Server

CAS Server是一個web應用包,部署在web服務器上,負責完成對用戶的認證工作,另外由於Client與CAS Server之間的交互採用Https協議,因此部署CAS Server的服務器還需要支持SSL協議。當SSL配置成功過後,像普通web應用一樣將CAS Server部署在服務器上就能正常運行了。

 CAS Server會處理用戶名/密碼等憑證(Credentials),它可能會倒數據庫檢索一條用戶賬號信息,也可能在XML文件中檢索用戶密碼,CAS均提供一種靈活但統一的接口/實現分離方式,CAS究竟用何種認證方式,跟CAS協議是分離的,也就是,這個認證的實現細節可以自己定製和擴展。

3.2.1 配置CAS Server環境

#將CA證書,即cas.com.keystore文件拷貝到%tomcat5%/conf目錄下

#CAS Server部署依賴包cas-server-core-3.4.7.jar cas-server-support-jdbc-3.4.7.jar

#配置CAS驗證數據庫,即配置/cas/Webcontent/WEB-INF/deployerConfigcontext.xml這個文件。

#其中需要修改的內容 select password from users where account=? , users /password/account請分別填寫實際的用戶表和用戶密碼以及登錄用戶名字段。

#當採用MD5進行加密,數據庫中的用戶密碼字段一定要是MD5進行過的,否則會登錄錯誤。

 

  下載cas-server-3.3\modules,複製cas-server-webapp-3.3.war到tomcat\webapps瞎,修改名稱爲cas.war,然後啓動IE,輸入http://localhost:8080/cas 檢驗是否可以訪問,如果可以,則輸入相通的用戶名和密碼,測試是否可以登錄。

 <bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">

         <property name="credentialsToPrincipalResolvers">

                    <list>

                           <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver"/>

                           <bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver"/>

                    </list>

          </property>

          <property name="authenticationHandlers">

                    <list>

                           <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"/>

                           <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

                           <property name="sql" value="select password from users where account=?"/><!--根據實際情況修改 -->

                          <property name="dataSource" ref="dataSource"/>

                          <property name="passwordEncoder" ref="MD5passwordEncoder"/>

                         </bean>

                    </list>

          </property>

</bean>

<!--根據實際情況配置 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

          <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

          <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>

          <property name="username" value="uname"/>

         <property name="password" value="upassword"/>

</bean>

<bean id="MD5passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordencoder">

                  <constructor-arg index="0">

                             <value>MD5</value>

                  </constructor-arg>

</bean>

       

到 CAS 官方網站下載 CAS Server 和 Client,地址分別爲:

http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip 

將CAS Server發佈包拷貝到%tomcat%/webapps/目錄下。

由於前面已配置好tomcat的https協議,可以重新啓動tomcat,然後訪問 https://localhost:8443/sso(工程名) 如果能出現工程登錄頁面,則說明CAS Server已經部署成功。

3.2.2 CAS Client部署

CAS Client負責部署在客戶端(web應用),原則上,CAS Client的部署意味着,當有對本地web應用的受保護資源的訪問請求,並且需要對請求方進行身份驗證,web應用不再接受任何的用戶密碼等類似的Credentials,而是重定向到CAS Server進行認證。

CAS Client以Filter方式保護web應用的受保護資源,過濾從客戶端過來的每一個web請求,同時,CAS Client會分析HTTP請求中是否包請求Service Ticket,如果沒有,則說明該用戶是沒有經過認證的。於是,CAS Client會重定向用戶請求到CAS Server.如果用戶提供了正確的Credentials , CAS Server會產生一個隨機的Service Ticket,然後,緩存該Ticket,並且重定向用戶到CAS Client(附帶剛纔產生的Service Ticket),Service Ticket是不可僞造的,最後是CAS Client和CAS Server之間完成了一個對用戶的身份覈實,用Ticket查到username,因爲Ticket是CAS Server產生的,所以CAS Server的判斷是毋庸置疑的。

單點登錄的母的是爲了讓多個相關聯的應用使用相同的登錄過程,本過程中在eclipse 中構造2個簡單的web工程。分別以castest1和castest2來作爲實力,他們均只有一個頁面,顯示歡迎信息即可。通過本文的配置,實現單點登錄,即只需登錄一次就可以訪問這兩個應用。

在Eclipse建立的客戶端工程中加入 casclient.jar和cas-client-core-3.2.0.jar.修改web.xml文件,添加CAS Filter。 如清單所示:

<web-app>
...
<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://localhost:8443/sso/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://cas.com.keystore:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

...
</web-app>

# edu.yale.its.tp.cas.client.filter.loginUrl         指定CAS提供登錄頁面的URL

#edu.yale.its.tp.cas.client.filter.validateUrl     指定CAS提供service ticket或proxy ticket驗證服務的URL

#edu.yale.its.tp.cas.client.filter.serverName   指定客戶端的域名和端口,是指客戶端應用所在機器而不是CAS Server所在機器

在上面配置結束後,啓動tomcat

 

#驗證服務器端

打開瀏覽器,訪問https://localhost:8443/sso ,瀏覽器會彈出服務端登錄頁,登錄後即轉到登錄頁面。

#驗證客戶端

打開瀏覽器,訪問http://localhost/casetest1,瀏覽器會彈出安全提示,接收後即轉到SSO登錄頁面,登錄成功後,再定向到casetest1的首頁面,可以看到地址欄裏的地址多出了一個ticket參數,這就是CAS分配給當前應用的ST(Service Ticket);

再在同一個窗口打開瀏覽器,訪問http://localhost/casetest2,瀏覽器會彈出安全提示,接受後即轉到SSO登錄頁面,登錄成功後,再定向到casetest2的首頁面。之後再在地址欄重新輸入http://localhost/casetest1,會直接顯示 casetest1的頁面而無需再次登錄。

 

結束語

本文檔介紹了CAS單點登錄解決方案的原理,並結合實例講解了在tomcat中使用CAS的配置、部署方法和效果,CAS是作爲開源單點登錄解決方案的一個不錯的選擇,更多使用細節可以參考CAS官方網站。

發佈了45 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章