Cas单点登录配置SSL时遇到的javax.net.ssl.SSLPeerUnverifiedException问题的解决方法
网上有很多资料介绍如何集成CAS单点登录产品。由于集成CAS需要预先在tomcat中配置SSL,而且还要在客户端导入证书,但是许多人按照网上介绍的操作操作却发现以下问题:尽管配置了SSL后可以访问https://localhost:8443,也能登录https://localhost:8443/cas/login,但是在地址栏输入自己的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中增加以下配置:
<Connector port="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
keytool -import -keystore C:/jre