CAS SSO 错误返回PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:

在CAS单点登录项目实施中遇到SSLHandshakeException,原因是客户端和服务器端JDK版本不一致或证书问题。解决办法是参照兔哥的博客重新生成证书并导入到正确JDK的证书库中,注意CAS服务器主机名填写正确,并删除已存在的证书。

在用CAS做单点登录项目时,主要参考的是兔哥的博客:诸位请看,先感激一下下:http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html



配置好后,run客户端,输入了用户名和密码,但是从服务器端跳转到客户端的时候出现了下列错误:

ava.lang.RuntimeException: 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

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:341)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:305)

    org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:50)

    org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:207)

    org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:169)

    org.jasig.cas.client.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:116)

    org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)


root cause

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

    sun.security.ssl.Alerts.getSSLException(Alerts.java:192)

    sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1836)

    sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)

    sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)

    sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1337)

    sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:154)

    sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)

    sun.security.ssl.Handshaker.process_record(Handshaker.java:804)

    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:966)

    sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)

    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)

    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)

    sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)

    sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)

    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)

    sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:326)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:305)

    org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:50)

    org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:207)

    org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:169)

    org.jasig.cas.client.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:116)

    org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)


root cause

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)

    sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)

    sun.security.validator.Validator.validate(Validator.java:260)

    sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)

    sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)

    sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)

    sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319)

    sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:154)

    sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)

    sun.security.ssl.Handshaker.process_record(Handshaker.java:804)

    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:966)

    sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)

    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)

    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)

    sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)

    sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)

    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)

    sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:326)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:305)

    org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:50)

    org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:207)

    org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:169)

    org.jasig.cas.client.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:116)

    org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)


root cause

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)

    java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)

    sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)

    sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)

    sun.security.validator.Validator.validate(Validator.java:260)

    sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)

    sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)

    sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)

    sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319)

    sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:154)

    sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)

    sun.security.ssl.Handshaker.process_record(Handshaker.java:804)

    sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:966)

    sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)

    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)

    sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)

    sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)

    sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)

    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)

    sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:326)

    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:305)

    org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:50)

    org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:207)

    org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:169)

    org.jasig.cas.client.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:116)

    org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)



原因:客户端run的jdk 和server端run的jdk版本不同,或者你拥有多个jdk,在配置的时候,run的其实不是你导入证书的那个jdk.


解决方案:请参考第一行 兔哥的博客,去重新生成一个证书,到你要用的jdk中。


重新生成中请注意:

1.“ 您的名字和姓氏” 这一项,其实是你cas server端的host name,不要乱写。 一开始我写成了自己的名字,在运行项目的时候说,找不到我的服务器名字。


2. 导入到jdk证书库的时候,有提示说已存在某证书名。 请先删除:

(1)先切到 你的jdk ->jre->lib->security 哩

(2) 在用命令删除已存在的证书: keytool -delete -alias wsria -keystore cacerts -storepass 666666 

注:-alias 是化名的意思,在创建的时候已用到。

-keystore 就是键库的意思,在securty下有个文件cacerts是存储键的。

-storepass  就是你创建这个key的时候用到的密码。 输入正确密码才能删除已有的key.


### 调用第三方SSO登录接口时出现SSL握手异常问题的解决方案 当调用第三方单点登录(SSO)接口时遇到 `javax.net.ssl.SSLHandshakeException` 和 `sun.security.validator.ValidatorException: PKIX path building failed` 的错误,通常是因为客户端无法验证服务器提供的SSL/TLS证书的有效性。以下是详细的分析和解决方案。 #### 错误原因 该错误表明Java应用程序未能找到一条有效的认证路径来验证目标站点的SSL证书。这可能是由于以下原因之一引起的: - 服务器使用的SSL证书未被Java的信任库(cacerts文件)识别。 - 服务器配置了自签名证书或中间CA未受信任。 - 客户端网络环境中的代理或其他安全设备干扰了SSL连接过程[^1]。 #### 解决方案一:导入正确的根证书到JVM信任库 如果可以获取并确认服务器所使用的是合法但尚未安装至本地JDK/JRE cacerts的信任链,则可以通过手动将其添加进来解决问题: ```bash keytool -import -alias yourAliasName -keystore $JAVA_HOME/jre/lib/security/cacerts -file server-cert.cer ``` 执行此命令前需下载对应的`.cer`格式证书文件,并替换默认密码`changeit`为实际值(视操作系统版本而定)[^1]。 #### 解决方案二:忽略SSL验证(仅用于测试) 对于开发阶段或者非生产环境中允许临时关闭HTTPS校验逻辑以便继续调试业务功能的情况,可采用如下方法实现对所有SSL请求均予以放行处理: ```java public static CloseableHttpClient createInsecureClient() { try { SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial((chain, authType) -> true) // 自动接受任何证书 .build(); HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory( sslContext, hostnameVerifier); return HttpClients.custom().setSSLSocketFactory(socketFactory).build(); } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) { throw new RuntimeException(e); } } ``` 注意这种方法存在严重的安全隐患,在正式部署之前务必移除此类代码片段[^2]。 #### 总结 针对上述提到的不同场景分别采取相应措施能够有效应对因SSL Handshake失败引发的各种状况。推荐优先考虑正规途径即更新信任存储而非轻易放弃安全性保障。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值