jna-Waffle 与 Windows kerberos 票据缓存交互?

问题描述 投票:0回答:1

我们有一个 Windows 客户端应用程序,它使用 groovy 脚本与使用 spnego 作为身份验证的 webapi 服务器进行交互。该脚本每次都使用 waffle 库查询新的 kerberos 令牌。问题:是否可以使用 Windows 缓存来保存/检索令牌?如果是这样,如何获得令牌时间有效性?

我在文档中没有找到有关此内容的信息:https://github.com/Waffle/waffle 请求令牌的实际脚本,以防它对任何人有帮助。

String securityPackage = 'Negotiate'
String spnTarget = 'HTTP/dummy.serve'
IWindowsSecurityContext ctx = WindowsSecurityContextImpl.getCurrent(securityPackage, spnTarget)
byte[] token = ctx.getToken()
String token64 = Base64.getEncoder().encodeToString(token)
java windows groovy kerberos waffle
1个回答
0
投票

问题:是否可以使用Windows缓存来保存/检索令牌?

这些令牌是一次性的,缓存它们没有意义。

不要将令牌与票证混淆 - Kerberos ticket 是可缓存对象,每当程序创建 SSPI 上下文时,Windows 都会自动缓存,而令牌是从票证中生成的,并且是一次性的。

Kerberos 票证不像不记名令牌;它们带有一个私有部分(会话密钥),用于为每个上下文生成一个新的“验证器”。您从 SSPI 获取的令牌是缓存的票证和一次性身份验证器的组合。

因此,如果您将 Kerberos 与 HTTP 结合使用,则您的示例是正常的处理方式 - 由于 HTTP 是无状态的,因此每个请求都涉及创建新的 SSPI 上下文并获取新的令牌。第一个令牌将导致 Windows 获取并自动缓存票证;后续令牌将使用缓存的票证。

如果您查看

klist
的输出,您可能会看到
HTTP/dummy.serve
的票证已经缓存在那里。 (具体来说
C:\Windows\System32\klist.exe
– 不要与 MIT Krb5 klist 或 Java klist 或 Oracle klist 混淆。)

如果是这样,如何获取token时间有效性?

Kerberos 令牌实际上没有这样的概念,因为它们在第一次使用时就会失效。

虽然从技术上讲,只要其各自的票证有效,“未使用”的代币就会保持有效,但囤积未使用的代币以供以后使用并没有多大意义——只需在需要时从 SSPI 获取一个新的代币即可,否则您将重复 SSPI 已经完成的工作。 至于票证,其有效性通常对客户端软件不重要(Windows 负责续订),但如果它确实重要,您应该能够从

context 的

clientLifetime 属性获取该信息(或类似的东西 – 我无法完全破译华夫饼源代码)。

    

© www.soinside.com 2019 - 2024. All rights reserved.