日期:2014-05-19  浏览次数:20696 次

关于spring security3与cas3整合的the trustAnchors parameter must be non-empty问题
步骤: 
1. 生成服务器端证书,配置好服务器端tomcat
2. 部署cas server. 
3. 运行cas server,正常,可以登录。
4. 部署cas client(结合spring security)
5. 运行客户程序,可以正常跳转到cas server的登录页面。
6. cas server可以登录成功。但在登录完,跳转回客户端地址:http://localhost:8080/ssm/j_spring_cas_security_check?ticket=ST-5-Q6nm7lBb1SfsbvdOrkFs-cas 时。
客户端抛出异常:javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected [b][/b]error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1520)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1487)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1470)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1063)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1040)
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:981)
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:281)


在网上多处查询,都告知可能是客户端证书问题。
证书使用  
1. keytool将服务器端证书导出成 xxx.cer,在客户端浏览器加载成功。
2. 也换成 openssl + keytool 试过,依然无解。

在下想知道两件事:

1. cas服务器登录成功回转地址: http://localhost:8080/ssm/j_spring_cas_security_check?ticket=ST-5-Q6nm7lBb1SfsbvdOrkFs-cas ,在此时,到底发生了些什么?
2. 在跳转到客户端页时才出错,跟客户端证书有关吗?trustAnchors是个什么东东?

大家共同探讨探讨。谢谢

------解决方案--------------------
遇到了与你一模一样的问题,通过设置证书系统属性解决了。
System.setProperty("javax.net.ssl.trustStore",keystorePath);