Cas單點登入配置SSL時遇到的javax.net.ssl.SSLPeerUnverifiedException問題的解決方法
網上有很多資料介紹如何整合CAS單點登入產品。由於整合CAS需要預先在tomcat中配置SSL,而且還要在客戶端匯入證書,但是許多人按照網上介紹的操作操作卻發現以下問題:儘管配置了SSL後可以訪問也能登入但是在位址列輸入自己的Web應用的連線,自動跳到Cas登入頁面,登入成功後並沒有跳回到受保護頁面,而是報下面的異常:
<javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated>
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificateChain
…
這是什麼原因呢?
首先簡單回顧一下網上介紹的操作步驟:
首先是生成server端的證書
keytool -genkey -alias tomcat -keyalg RSA (說明,提示姓名的時候輸入localhost而不是你的名字)
keytool -export -file server.crt -alias tomcat
將C:/Documents and Settings/bzwang/.keystore檔案複製到tomcat的conf目錄(bzwang是windows的當前使用者目錄,tomcat是要配置cas server的tomcat),.keystore是和tomcat的server.xml
然後server.xml中增加以下配置:
<Connectorport="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" disableUploadTimeout="true"acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"keystoreFile="conf/.keystore"keystorePass="changeit"/>
這是CAS 所在的tomcat的配置方式,server端環境配置完成。然後在客戶端JVM匯入證書,由於現在server端和client端都在一臺機器上,所以需要注意,實際環境中cas和客戶端應用是在不同機器上,匯入證書是在部署了web應用的那臺機器上執行的。網上介紹客戶端匯入證書的命令是:
keytool -import -keystore %JAVA_HOME%/jre/lib/security/cacerts -file server.crt -alias tomcat
客戶端應用的web.xml中如何配置CAS過濾器我就不講了,這裡重點要說的是為什麼用keytool –import 語句匯入證書卻仍然出現javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated之類的異常,問題是因為你機器上實際的JRE環境不是在JAVA_HOME裡的那個JRE,一般大家安裝JDK時都預設安裝了JDK和JRE,例如我的機器上的jdk安裝在C:/jdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.5.0</chsdate>_05,JRE安裝在C:/jre1.5.0_05,所以除了執行上面的import指令外,還需要執行下面的指令:
keytool -import -keystore C:/jre<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.5.0</chsdate>_05/lib/security/cacerts -file server.crt -alias tomcat
所以請大家一定要牢記,如果你的主機上有多個JRE的話,最好每個JRE路徑下都用keytool –import指令匯入一次,如果其他配置沒問題的話,做完這步一定