jasig.cas客户端认证成功后ConnectionTimedout

本文记录了在新的机器上搭建CAS环境时遇到的问题:客户端配置CASfilter后出现连接超时异常。通过检查host文件中的IP地址并进行调整,最终解决了跳转异常。

今天需要在新的机器上搭建CAS环境,搭建完成后cas端与客户端单独启动都可以访问,但客户端在配置CAS filter并且进行认证登陆成功后,跳转到客户端时抛出了如下异常

java.net.ConnectException: Connection timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625)
    at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:275)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:429)
    at org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:41)
    at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:193)
    at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:204)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.jasig.cas.client.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:164)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:97)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

一开始猜测是cas-client配置问题,经过比对发现配置并没有问题。在经过反复重启更改配置和查看源码后,走投无路。查看host文件,发觉是由于host中的Ip不是正确的Ip。经过调整后刷新页面,成功跳转client端

<think>我们正在处理一个CAS(Central Authentication Service)客户端票证验证异常异常信息表明,客户端尝试使用服务票证(ST)进行验证时,CAS服务器未能识别该票证。 可能的原因包括: 1. 票证已过期(CAS服务票证默认有效期很短,通常为几秒到几分钟) 2. 票证已被使用(服务票证是一次性的,只能使用一次) 3. 票证在CAS服务器上未被正确存储(例如,服务器重启或分布式环境下同步问题) 4. 客户端和服务端时间不同步(因为票证验证涉及时间戳) 5. 客户端在验证时提供的服务URL与申请票证时记录的服务URL不匹配(包括大小写、端口等细节不一致) 根据堆栈信息,我们使用的是CAS客户端(org.jasig.cas.client)的验证过滤器(TicketValidationFilter)进行验证。 解决方案步骤: 1. **检查票证有效期**:确认从申请票证到验证票证的时间间隔是否超过CAS服务器设置的票证有效期(默认10秒)。如果超时,需要重新申请。 2. **检查票证是否重复使用**:确保同一个服务票证只验证一次。如果客户端重试导致重复验证,应重新定向到CAS登录获取新票证。 3. **检查CAS服务器状态**:确保CAS服务器正常运行,且存储该票证(例如,检查服务器的票据存储,如内存、Redis等)。 4. **检查时间同步**:确保CAS服务器和客户端服务器的时间同步(使用NTP服务)。 5. **检查服务URL**:确保在验证时发送给CAS服务器的service参数与申请票证时完全一致(包括协议、域名、端口、路径和查询参数)。注意避免大小写不一致、多余的斜杠等。 6. **查看CAS服务器日志**:在CAS服务器端查找该票证(ST-2848606-Qi3seur3ViGbVsue-aQG9ACUeTUcas3)的相关日志,确认为什么没有被识别。 7. **网络问题**:检查客户端CAS服务器之间的网络连接,确保验证请求能正确到达CAS服务器。 8. **分布式环境问题**:如果CAS服务器部署在多个节点,确保票据存储是共享的(如Redis、数据库)并且节点之间同步正常。 9. **客户端配置**:检查CAS客户端的配置,特别是`casServerUrlPrefix`和`service`(或`serverName`)是否正确。 示例配置片段(web.xml): ```xml <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://cas.example.com/cas</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>https://your.service.com</param-value> </init-param> </filter> ``` 10. **调试日志**:在客户端启用详细日志,以便跟踪验证请求和响应。例如,在log4j.properties中增加: ``` log4j.logger.org.jasig=DEBUG ``` 11. **升级客户端**:如果使用的是旧版本CAS客户端,考虑升级到最新版本,以修复可能的已知问题。 由于该异常发生在`Cas20ServiceTicketValidator.parseResponseFromServer`方法中,说明CAS服务器返回了错误响应(通常是INVALID_TICKET)。因此,重点应放在票证本身和服务器对票证的识别上。 如果以上步骤无法解决,可以考虑在CAS服务器端启用调试日志,查看该票证的验证过程。 注意:在分布式系统中,确保票据存储的共享和同步至关重要,否则容易出现此类问题。 根据上述分析,提出相关问题: §§相关问题§§ 1.CAS单点登录流程中,服务票证(ST)的生命周期通常包括哪些阶段?如何配置其有效期? 2.CAS服务器部署在集群环境时,有哪些推荐的票据存储方案(如Redis、Memcached)?如何配置? 3. 如何通过CAS客户端的日志配置来捕获详细的票证验证请求和响应信息? 4. 在服务URL包含动态端口(如随机端口)的情况下,如何确保申请票证和验证票证时的服务URL一致性? 5. 如果客户端CAS服务器之间存在反向代理(如Nginx),需要特别注意哪些配置以避免服务URL被篡改?</think>### CAS客户端票证验证异常分析及解决方案 #### 异常原因分析 `TicketValidationException: Ticket not recognized` 表示CAS客户端无法验证服务票证(ST),核心原因包括: 1. **票证过期**(最常见) - CAS服务票证默认有效期仅**10秒**(通过`ticketGrantingTicketExpirationPolicy`配置) - 网络延迟或服务端处理超时导致验证时已过期 2. **票证重复使用** - ST是**一次性凭证**,若客户端重复提交验证请求会触发此异常 3. **服务URL不匹配** - 申请票证时的服务URL(如`https://app1.com`)与验证时URL(如`https://APP1.com`)大小写不一致 - 端口号或路径差异(如缺少`/`结尾) 4. **服务器配置问题** - CAS服务器票据存储异常(内存/Hazelcast/Redis) - 服务器集群间时间不同步(超过5秒偏差) - 票据清理线程异常终止 --- #### 解决方案步骤 ##### 1. 基础排查 ```bash # 检查CAS服务器时间同步 ntpdate -q pool.ntp.org # 验证票据存储状态(需CAS管理权限) curl -k -u admin:password https://cas-server/cas/actuator/ticketRegistry ``` ##### 2. 客户端配置修正 ```java // 确保服务URL精确匹配(web.xml配置示例) <context-param> <param-name>serverName</param-name> <param-value>https://your-app.com:443</param-value> <!-- 包含协议/端口/路径 --> </context-param> ``` ##### 3. 服务器端调整 ```properties # CAS配置文件 (cas.properties) # 延长ST有效期至60秒 ticket.st.timeToKillInSeconds=60 # 启用票据存储监控 ticket.registry.cleaner.schedule.enabled=true ticket.registry.cleaner.repeatInterval=120000 ``` ##### 4. 异常处理增强 ```java // 自定义验证过滤器处理异常 public class CustomValidationFilter extends Cas20ProxyReceivingTicketValidationFilter { @Override protected void onFailedValidation(HttpServletRequest request, HttpServletResponse response) { if (exception instanceof TicketValidationException) { // 1. 记录原始票证ST-xxx // 2. 重定向到重新认证流程 response.sendRedirect("/relogin?cause=ticket_invalid"); } } } ``` --- #### 调试诊断工具 | 工具 | 命令/方法 | 检测目标 | |------|-----------|----------| | **Wireshark** | `tcp.port==9443 && http` | 验证请求/响应内容 | | **CAS管理端点** | `/cas/actuator/tickets` | 实时票据状态 | | **日志分析** | `grep "ST-2848606" cas_server.log` | 票证生命周期追踪 | | **时间同步检查** | `timedatectl status` | 服务器间时间差 | > ⚠️ **关键注意事项**: > 1. 生产环境必须使用HTTPS,HTTP会导致票证自动失效 > 2. 集群部署时需配置共享票据存储(推荐Redis) > 3. 客户端/服务端日志级别调整为`DEBUG`捕获完整流程
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值