我对 Rust 来说“相对较新”,正在尝试解决更复杂的任务。遗憾的是,我还无法使用启用 kerberos 的端点进行身份验证。我已经尝试/试验了大多数 kerberos 板条箱,但自己还找不到解决方案。我也尝试过curl实现但无济于事。
我有一个通过 kerberos 进行身份验证的主机(使用 klist 时会列出 TGT),并且我正在尝试创建对 kerberos 安全网站/端点(获取/发布)的请求。我没有任何具体要求如何创建请求/使用哪个板条箱来处理请求,只要它们经过身份验证即可。
我之前使用过 python,并使用 kerberos 模块处理请求。是否有任何类似的板条箱或实现可以让我无法像 kerberos-request python 模块一样“轻松”进行身份验证?
例如
requests.get("http://example.org", auth=HTTPKerberosAuth())
在 python 中。
我找不到任何“易于使用”的库,但如果你想制作自己的库,这里是一般方法:
查找提供与系统的 GSSAPI 库(对于 Linux)或系统的 SSPI 库(对于 Windows)的绑定的库。是的,您确实需要系统库,尤其是对于 Windows – 这是您访问系统为您存储的凭据的方式。
发出请求之前:调用 GSSAPI“初始化上下文”函数,提供正确的服务器 SPN,并指定“启动”作为模式,“SPNEGO”作为机制。
可以使用两种“名称类型”;一个是 GSSAPI hostbased_name,另一个是 Kerberos 主体名称。一般来说,GSSAPI 会期望前一种 (hostbased_name) 类型;对于 HTTP,它将是
HTTP@
(大写)+ URL 中指定的确切域(小写)。 Kerberos 主体名称类似,但带有 HTTP/
。
在上下文中调用“step”函数来接收令牌。
对令牌进行 Base64 编码,将其格式化为
Negotiate <token>
(例如“协商 AbCd”),然后将其作为 Authorization:
标头添加到您的请求中。
HTTP 响应可能会在 WWW-Authenticate 中为您提供另一个令牌,您可以将其提供给 step() 函数以进行“相互身份验证”,但实际上可以安全地忽略 - 我相信 requests-kerberos 不会进行相互身份验证默认情况下,它只依赖 TLS 来验证服务器。
因为 HTTP 是无状态的并且不会持久验证,所以每个新请求都需要您创建一个newGSSAPI 上下文,以便它可以从步骤 1 重新开始。(请注意,“新请求”也包括后续重定向– 令牌不可可重用 – 因此您需要连接到 HTTP 客户端,以便它自动完成所有这些操作。)