如何在 Rust 中创建使用 kerberos 进行身份验证的请求

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

我对 Rust 来说“相对较新”,正在尝试解决更复杂的任务。遗憾的是,我还无法使用启用 kerberos 的端点进行身份验证。我已经尝试/试验了大多数 kerberos 板条箱,但自己还找不到解决方案。我也尝试过curl实现但无济于事。

我有一个通过 kerberos 进行身份验证的主机(使用 klist 时会列出 TGT),并且我正在尝试创建对 kerberos 安全网站/端点(获取/发布)的请求。我没有任何具体要求如何创建请求/使用哪个板条箱来处理请求,只要它们经过身份验证即可。

我之前使用过 python,并使用 kerberos 模块处理请求。是否有任何类似的板条箱或实现可以让我无法像 kerberos-request python 模块一样“轻松”进行身份验证?

例如

requests.get("http://example.org", auth=HTTPKerberosAuth())
在 python 中。

rust request kerberos
1个回答
0
投票

我找不到任何“易于使用”的库,但如果你想制作自己的库,这里是一般方法:

  1. 查找提供与系统的 GSSAPI 库(对于 Linux)或系统的 SSPI 库(对于 Windows)的绑定的库。是的,您确实需要系统库,尤其是对于 Windows – 这是您访问系统为您存储的凭据的方式。

  2. 发出请求之前:调用 GSSAPI“初始化上下文”函数,提供正确的服务器 SPN,并指定“启动”作为模式,“SPNEGO”作为机制。

    可以使用两种“名称类型”;一个是 GSSAPI hostbased_name,另一个是 Kerberos 主体名称。一般来说,GSSAPI 会期望前一种 (hostbased_name) 类型;对于 HTTP,它将是

    HTTP@
    (大写)+ URL 中指定的确切域(小写)。 Kerberos 主体名称类似,但带有
    HTTP/

  3. 在上下文中调用“step”函数来接收令牌。

  4. 对令牌进行 Base64 编码,将其格式化为

    Negotiate <token>
    (例如“协商 AbCd”),然后将其作为
    Authorization:
    标头添加到您的请求中。

  5. HTTP 响应可能会在 WWW-Authenticate 中为您提供另一个令牌,您可以将其提供给 step() 函数以进行“相互身份验证”,但实际上可以安全地忽略 - 我相信 requests-kerberos 不会进行相互身份验证默认情况下,它只依赖 TLS 来验证服务器。

因为 HTTP 是无状态的并且不会持久验证,所以每个新请求都需要您创建一个newGSSAPI 上下文,以便它可以从步骤 1 重新开始。(请注意,“新请求”也包括后续重定向– 令牌不可可重用 – 因此您需要连接到 HTTP 客户端,以便它自动完成所有这些操作。)

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