在作为 AD 域成员且基于 Kerberos 身份验证的 Windows 主机上,浏览器如何获取 TGT 和服务票证来访问特定服务(例如具有 kerberos 身份验证的代理)?我想了解它在实现层面使用了哪些API。
我确实在 guthub 上找到了 gokrb5 Golang 库,它实现了这一点,但它需要 keytab 文件来获取 TGT 和服务票证。浏览器如何在没有 keytab 文件的情况下获取 kerberos 票证?
在作为 AD 域成员且基于 Kerberos 身份验证的 Windows 主机上,浏览器如何获取 TGT 和服务票证来访问特定服务(例如具有 kerberos 身份验证的代理)?我想了解它在实现层面使用了哪些API。
浏览器使用 SSPI,它是 Microsoft 的 GSS-API 变体 - 一种通用安全协议 API,允许您与 Kerberos 以及 NTLM 进行交互。
使用 SSPI(以及 GSS-API),浏览器根本不直接处理票证 - 它只要求 SSPI 为特定服务主体输出“令牌”,然后 SSPI 负责所有票证获取。
在 Python 中使用 sspilib 或 pyspnego 进行实验。 (我有一些例子。)
(请注意,SSPI 中的“机制”或“安全包”通常设置为“协商”(又名 SPNEGO)而不是原始的“Kerberos”,但 API 保持完全相同......并且通常 SPNEGO 只是简短-无论如何,电路到 Kerberos。)
我确实在 guthub 上找到了 gokrb5 Golang 库,它实现了这一点,但它需要 keytab 文件来获取 TGT 和服务票证。浏览器如何在没有 keytab 文件的情况下获取 kerberos 票证?
它从用户的密码中派生出密钥。用户(客户端)主体具有密码派生密钥,而不是随机生成的密钥(MD4 或 PBKDF2-SHA1 用于密钥派生)。
但是,实际上处理 Kerberos 的并不是浏览器,而是 SSPI 后端 (Windows LSASS.EXE)。浏览器仅向 Windows(通过 SSPI)请求给定服务的令牌,而永远无法访问原始密钥。 (把它想象成 ssh-agent。)
因此,当您登录 Active Directory 帐户时,Windows 会从您的密码(使用 MD4 或 PBKDF2-SHA)派生您帐户的 Kerberos 密钥,并使用它来获取票证。如果您是本地帐户,您可以将 Kerberos 凭据存储在“Windows 凭据存储”中,这些凭据也将由 SSPI 使用。
(事实上,在 AD 上,甚至服务也有密码派生密钥;Linux 主机有系统密钥表,Windows 主机有一个具有相同功能的“计算机帐户密码”。)
Gokrb5 是一个异常值,因为(与 Golang 中的许多事情一样)它坚持从头开始实现整个协议,而不是为操作系统提供的 Kerberos 支持提供接口。因此,它无法访问您的登录凭据,您必须提供密钥表或密码才能获取 TGT。
最后,密钥(无论是密码还是密钥表)仅用于获取初始票证(TGT)——之后,仅 TGT 用于服务票证。