1.使用keytool生成根證書
1.1.查看jre信任的證書
(1)查看jre中所有信任的證書信息
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
(2)查看別名爲root的證書信息
keytool -v -list -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
1.2.刪除jre中別名爲root的證書
keytool -delete -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
1.3.開始生成根證書
確認jre中不存在別名爲root的證書之後,我們開始生成根證書。
(1)生成密鑰庫文件root.keystore
keytool -genkey -keyalg RSA -alias root -dname " CN=localhost, OU=javaeeOU, O=javaee, L=GuangZhou, ST=GuangDong, C=CN" -storepass changeit -keystore root.keystore
使用默認密碼,直接回車。
(2)導出別名爲root的證書,證書名root.crt
keytool -export -alias root -file root.crt -storepass changeit -keystore root.keystore
(3)將證書導入到jre信任證書庫中
keytool -import -alias root -file root.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
(4)查看別名爲root的證書信息,確認成功導入到jre信任證書庫中
keytool -v -list -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
2.啓用HTTPS
2.1.在Tomcat中啓用HTTPS配置
打開Tomcat目錄下的conf/server.xml文件,添加Connector代碼如下:
- <span style="font-size: small;"><Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" minSpareThreads="2" maxSpareThreads="10"
- scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS"
- keystoreFile="conf/root.keystore" keystorePass="changeit"
- truststoreFile="E:/DevelopTools/JDK/jdk1.5.0_10/jre/lib/security/cacerts" /></span>
其中:
keystoreFile指向密鑰庫文件root.keystore
keystorePass默認爲changeit
truststoreFile指向jre信任的證書庫文件
2.2.安裝證書
啓動Tomcat,訪問地址:https://localhost:8443/cas3,瀏覽器將會返回證書錯誤界面:
單擊“繼續瀏覽此網站(不推薦)”鏈接,查看並將證書導入到瀏覽器中:
單擊“查看證書”,彈出證書安裝界面:
單擊“安裝證書”,進入證書導入嚮導界面:
選擇“受信任的根證書頒發機構”,接下來只需要一路選擇“下一步”或者“是”直至導入成功。
證書導入成功後,重新瀏覽器並訪問地址:https://localhost:8443/cas3,將會看到類似於下圖的鎖圖標,並可單擊該圖標查詢證書信息,這表示證書已安裝成功,正確啓用了HTTPS。
3.對Web應用實施SSO
Web應用採用Tomcat自帶的servlet例子Hello World,默認訪問路徑爲http://localhost:8080/examples/servlets/servlet/HelloWorldExample。在沒有對該servlet實施SSO之前,啓動Tomcat後訪問結果如下圖所示:
接下來,我們將對該servlet實施SSO,配置步驟如下:
3.1.添加Cas Client相應Jar包
只需要添加兩個Jar包:cas-client-core-3.1.10.jar、commons-logging-1.0.4.jar,將其拷貝到Tomcat安裝目錄下的webapps\examples\WEB-INF\lib目錄下。
3.2.配置web.xml文件
對於Cas Client在web.xml文件中的配置,主要包括兩個方面,一個是過濾器的配置,另一個是監聽器的配置。
3.2.1.過濾器配置
主要有以下5個過濾器:
1.SingleSignOutFilter
2.AuthenticationFilter
3.TicketValidationFilter (whichever one is chosen)
4.HttpServletRequestWrapperFilter
5.AssertionThreadLocalFilter
對於這5個過濾器,在web.xml中的配置必須嚴格按照以上順序進行聲明。
其中,AuthenticationFilter、TicketValidationFilter是必須配置的,其他3個過濾器是可選的。特別的,如果配置了SingleSignOutFilter,必須配合SingleSignOutHttpSessionListener這一監聽器進行使用。
3.2.1.1.SingleSignOutFilter
該過濾器用於實現單點登出功能,可選配置。配置如下:
- <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>/servlets/servlet/HelloWorldExample</url-pattern>
- </filter-mapping>
3.2.1.2.AuthenticationFilter
該過濾器負責用戶的認證工作,必須啓用它。配置如下:
- <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/cas3/login</param-value>
- </init-param>
- <init-param>
- <param-name>serverName</param-name>
- <param-value>localhost:8080</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CAS Authentication Filter</filter-name>
- <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
- </filter-mapping>
3.2.1.3.TicketValidationFilter
該過濾器負責對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/cas3</param-value>
- </init-param>
- <init-param>
- <param-name>serverName</param-name>
- <param-value>localhost:8080</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CAS Validation Filter</filter-name>
- <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
- </filter-mapping>
3.2.1.4.HttpServletRequestWrapperFilter
該過濾器負責實現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>/servlets/servlet/HelloWorldExample</url-pattern>
- </filter-mapping>
3.2.1.5.AssertionThreadLocalFilter該過濾器使得開發者可以通過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>/servlets/servlet/HelloWorldExample</url-pattern>
- </filter-mapping>
3.2.2.監聽器配置
當配置了SingleSignOutFilter過濾器,即對Web應用實施單點登出功能時,需要在web.xml中添加以下監聽器:
- <listener>
- <listener-class>
- org.jasig.cas.client.session.SingleSignOutHttpSessionListener
- </listener-class>
- </listener>
3.2.3.啓動應用
配置完成後,重新啓動Tomcat,並訪問地址http://localhost:8080/examples/servlets/servlet/HelloWorldExample,由於該servlet已受到Cas的保護,所以我們會被引導到Cas登錄頁面。
只有通過Cas認證,才能真正的訪問到http://localhost:8080/examples/servlets/servlet/HelloWorldExample這個servlet。