从服务器(很可能是某种 MS 软件)获取 Kerberos 令牌时,我收到以下响应。
如您所见,没有像 JWT 那样的过期时间或类似内容。所以我想知道令牌是否包含该信息,并考虑将其反序列化。但是,如果可能的话,我无法识别用于序列化信息的算法。 (我期望 Base64 等,但事实并非如此。)
那么问题:关于如何做到这一点有什么想法吗?
谢谢,
约亨
<?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetKerberosTokenResponse xmlns="http://tempuri.org/">
<GetKerberosTokenResult>YIIOcQYJKoZIhvcSAQICAQBugg5gMIIOXKADAgEFoQMCAQ6iBwMFAAAAAACjggy8YY
... Lots of lines removed for brevity ...
IWRzKQKdEnG9mT3U2qIKeS/Mhp+sif9O9212sEFgwH1WGI=</GetKerberosTokenResult>
</GetKerberosTokenResponse>
</soap:Body>
</soap:Envelope>
Kerberos 版本 5 使用 ASN.1 作为其序列化格式。您得到的结果是一个 Base64 编码的 ASN.1 对象。
您可以在 RFC 4120 第 5.3 节以及附录 A 中找到 Kerberos ASN.1 模块,尽管 SOAP 响应中实际拥有的是来自
RFC 4178附录 A 的 SPNEGO
NegTokenInit
对象(包含Kerberos AP-REQ
对象,然后包含实际的 Ticket
以及一次性身份验证器)。
Kerberos 票证的到期时间及其其他元数据可在票证的
EncTicketPart
字段中找到,该字段使用 服务密钥(在服务的密钥表中找到或从服务派生的密钥)进行加密户口密码)。这是因为 Kerberos 不使用数字签名 - 它基于预共享密钥和对称加密。
通常,如果您是请求实际票证的 Kerberos 客户端,您将收到可使用您自己的(客户端)密钥解密的票证元数据的另一个副本;然后您将使用票证及其会话密钥来生成身份验证器并生成令牌。但在您的情况下,您没有任何这些 – SOAP Web 应用程序代表您获取票证并直接生成一次性身份验证令牌 – 因此您在其中找到的所有数据都使用服务的密钥进行加密(因此当然,客户无法篡改它)。
换句话说,除非您拥有服务密钥,否则您将无法解密票证的内容。