一、搭建Java Web服務器環境
CATALINA_HOME = D:\Java\apache-tomcat-6.0.14
安裝完畢,啟動Tomcat ,在瀏覽器上 測試 http://localhost:8080/
出現上述界面,表明系統成功搭建。
二、使用Java Keytool工具為系統生成HTTPS證書,並為系統注冊
1. 刪除已有
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -delete -alias tomcat(隨意起的別名) -keystore D:/Java/jdk1.6.0_33/jre/lib/security/cacerts -storepass changeit
2. 生成密匙庫
輸入密鑰密碼和相應參數,(注意:第一個參數CN要輸入域名sso.shipengzhi.com,其他參數就隨便了),結果是在用戶目錄中創建了名為server.keystore的密鑰文件。
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -genkey -alias tomcat -keypass changeit -keyalg RSA -keystore server.keystore(密鑰文件名)
在當前目錄下多出一個文件server.keystore
3. 導出數字證書
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -export -alias tomcat -keypass changeit -file server.crt -keystore server.keystore
輸入keystore密碼:changeit
輸入上一步中的密碼,結果在當前目錄生成server.crt密鑰文件。(注意:這個文件是要導入客戶端的JVM上的)
4.將數字認證導入jre可信任區
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -import -alias tomcat -file server.crt -keypass changeit -keystore D:/Java/jdk1.6.0_33/jre/lib/security/cacerts
這里的jre地址和tomcat使用的jre必須一致
輸入密碼(注意:這里的密碼不是上面設定的密碼,而是changeit),將創建cacerts文件。
5. 查看可信證書列表(檢查證書是否加入成功)
C:\Program Files\Java\jdk1.6.0_10\bin>keytool -list -keystore D:\Java\jdk1.6.0_33/jre/lib/security/cacerts
6.命令解釋(轉)
-genkey 在用戶主目錄中創建一個默認文件".keystore",還會產生一個mykey的別名,mykey中包含用戶的公鑰、私鑰和證書
-alias 產生別名
-keystore 指定密鑰庫的名稱(產生的各類信息將不在.keystore文件中
-keyalg 指定密鑰的算法
-validity 指定創建的證書有效期多少天
-keysize 指定密鑰長度
-storepass 指定密鑰庫的密碼
-keypass 指定別名條目的密碼
-dname 指定證書擁有者信息例如: "CN=firstName,OU=org,O=bj,L=bj,ST=gd,C=cn"
-list 顯示密鑰庫中的證書信息 keytool -list -v -keystore 別名 -storepass ....
-v 顯示密鑰庫中的證書詳細信息
-export 將別名指定的證書導出到文件 keytool -export -alias 別名 -file 文件名.crt
-file 參數指定導出到文件的文件名
-delete 刪除密鑰庫中某條目 keytool -delete -alias 別名 -keystore sage
-keypasswd 修改密鑰庫中指定條目口令 keytool -keypasswd -alias 別名 -keypass .... -new .... -storepass ... -keystore 別名
-import 將已簽名數字證書導入密鑰庫 keytool -import -alias 別名 -keystore 證書名-file 文件名(可以加.crt 后綴)
以上是服務器端導入證書,放在tomcat用的jre下的證書庫中
三、配置Tomcat的HTTPS服務
在tomcat的server.xml中添加配置信息
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:/Users/shipengzhi/server.keystore" keystorePass="changeit"
truststoreFile="D:/Java/jdk1.6.0_33/jre/lib/security/cacerts"
clientAuth="false" sslProtocol="TLS"/>
keystorePass="changeit"參數,即為上面幾步中涉及到的密 碼,keystoreFile=".keystorePath",.keystorePath即為在第一步中生成的文件.keystore的全路徑,如: C:/Users/shipengzhi/server.keystore。
綁定hosts
10.1.164.118 sso.shipengzhi.com
啟動Tomcat,訪問https://localhost:8443/,出現以下界面說明HTTPS配置生效:
四、構建CAS服務器和過濾器
1.部署JA-SIG(CAS)服務器
cas官方網站
下載最新的服務端 CAS Server 3.5.0 Final
解壓后將modules下面的cas-server-webapp-3.3.3.war改名為cas.war部署到web服務器,作為單點登錄的服務器。
啟動Tomcat,訪問網址http://localhost:8080/cas/index.jsp或https://localhost:8443,出現以下畫面:
輸入用戶名/密碼 :linly/linly(任意兩個相同的字竄),點擊“登錄”,出現以下畫面:
表示CAS服務器配置運行成功。
2.為HelloWorldExample程序配置CAS過濾器
訪問http://shipengzhi:8080/examples/servlets/servlet/HelloWorldExample,出現以下界面說明應用正常啟動:
編輯D:\Java\apache-tomcat-6.0.14\webapps\examples\WEB-INF下的web.xml文件,添加如下信息:
<!-- ======================== 單點登錄開始 ======================== -->
<!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
<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://sso.shipengzhi.com:8443/cas/login</param-value>
<!--這里的server是服務端的IP-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</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://sso.shipengzhi.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== 單點登錄結束 ======================== -->
拷貝cas-client-core-3.2.1.jar,commons-logging-1.1.jar文件到目錄D:\Java\apache-tomcat-6.0.14\webapps\examples\WEB-INF\lib下。
啟動Tomcat。
測試使用瀏覽器登陸以下網址:http://shipengzhi:8080/examples/servlets/servlet/HelloWorldExample,頁面將彈出以下認證框,點擊“確定”
頁面將重定向到JA-SIG的SSO登錄認證頁面
輸入用戶名=密碼,如:linly/linly,則通過驗證,進入應用的入口界面,如下:
細心的用戶將發現,此時的URL不再是:
http://shipengzhi:8080/examples/servlets/servlet/HelloWorldExample,
URL的尾端帶上了一個ticket參數:
http://linly:8080/examples/servlets/servlet/HelloWorldExample?ticket=ST-2-qTcfDrdFb0bWndWgaqZD
到此,JA-SIG(CAS)服務器的初步SSO部署宣告成功。
異常Q&A
1.驗證ticket時,拋出異常
avax.servlet.ServletException: 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
解決辦法:
tomact使用的jvm的jre必須和數字認證導入jre可信任區時的jre一樣,拋出這個異常就是因為不一樣導致的。
2.如何將CAS和應用分布部署在不同的機器?
機器A: 部署CAS服務
機器B: 部署OA應用
機器C: 用戶瀏覽器端
1.由機器A上生成.keystore的證書文件,證書頒發者是機器A的完全域名
2.機器A上用於部署CAS的Tomcat的server.xml文件中定義HTTPS的配置,指向.keystore文件證書
3.從.keystore中導出的憑證文件要copy到機器B上,並導入機器B的JRE環境的證書庫中
4.機器B上部署OA的Tomcat必須指定運行在導入憑證JRE環境上,而不是JDK,這點常有人搞錯。