从客户端一侧看,这像是工作会话进行了一小时后莫名其妙地断线。托盘图标消失,隧道重新建立,日志里出现的是认证失败而不是网络错误。实际发生的是会话做了重新协商,第二次握手需要的凭据,客户端已经不再持有有效副本。登录时成功过的一次性动态码不能再用第二次,所以密钥重新协商正好按设计那样失败了。

解决办法是决定第二次握手该出示什么,而不是把重试计时器调长。

从客户端的角度走一遍这次交换

登录时客户端发送用户名、密码以及令牌设备上的一串动态码,服务器接受这个组合。随后会话一直运行,直到某个重新协商触发条件被满足,它在现有隧道内发起一次新的 TLS 握手。这次握手会再次要求认证。如果服务器的认证路径期望密码再加上一个当前的动态码,除非用户在场手动输入,客户端拿不出新的动态码。

大多数客户端不会在会话中途弹出提示,于是握手超时、隧道断开。用户看到的是重连,而不是认证提示,所以第一份报告通常把问题归到网络上。

auth-gen-token 改变了第二个问题由谁来回答

auth-gen-token 选项允许服务器在登录成功后签发一个令牌,之后的重新协商出示该令牌,而不必重复密码和动态码。手册记录了 它的生存期与续期行为,令牌必须当作带独立有效期的凭据来对待。在默认路径下,服务器自己校验令牌,而不再调用外部的密码认证器。

接入外部认证之后,这个分工就变了。插件必须理解令牌状态并施加自己的检查,因为决定会话是否继续的组件不再只有服务器。把令牌当成又一个数字型一次性动态码,并不等于实现了这个特性。

决定账户状态该如何处理

令牌活得比账户的访问权限更久,就是一个策略漏洞。要决定账户被禁用、组成员资格被移除或设备被吊销时,在令牌仍然有效的期间如何生效。较短的令牌生存期能缩小这个窗口;一条明确的吊销路径让它变成有意为之。在启用该选项之前把答案写下来,因为默认路径不会在每次重新协商时询问外部认证器。

在多服务器部署中,令牌签名密钥必须共享,否则客户端可能被送到无法校验其令牌的节点上。

要测试过期与重连,而不只是登录

在测试配置里把重新协商间隔调短,让第二次握手发生在你眼前,然后同时盯住两侧日志。确认令牌在登录时签发、在密钥协商时出示,并按配置的生存期续期或重新签发。然后再强制一次令牌过期和一次完整重连,因为能干净重连的客户端,在密钥协商路径上依然可能失败。

最后再测账户移除。这一种情况能告诉你,你写下的策略是被真正执行,还是只停留在文档里。

不要用关闭续期来“修复”它

把两端的重新协商间隔调成零,能消除症状,但密钥轮换也一并消失。这等于用一次没人评审过的策略变更,把凭据重放问题藏起来。保留续期,并根据用户是否在场,在服务器签发的令牌与全新的交互式挑战之间做选择。

更长的重试计时器不会让已经用掉的动态码重新有效。它只是把断线往后拖,并让日志更难读。

相关文章