将 --negotiate 与 curl 一起使用时,是否需要密钥表文件?

When using --negotiate with curl, is a keytab file required?

描述如何连接到 kerberos 安全端点的 documentation 显示如下:

curl -i --negotiate -u : "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=..."

必须提供 -u 标志,但被 curl 忽略。

--negotiate 选项是否会导致 curl 查找预先使用 kinit 命令创建的密钥表,或者 curl 会提示输入凭据?

如果它查找密钥表文件,该命令将查找什么文件名?

  1. 检查 curl 版本

    $ curl -V - 它应该支持功能 "GSS-Negotiate"

  2. 使用kinit

    登录

    $ kinit <user-id>

  3. 使用 curl

    $ curl --negotiate -u : -b ~/cookiejar.txt -c ~/cookiejar.txt http://localhost:14000/webhdfs/v1/?op=liststatus

    “--negotiate”选项启用 SPNEGO

    需要“-u”选项但被忽略(使用kinit时指定的原则)

    “-b”和“-c”选项用于存储和发送 http cookie。

成为该领域 curl 的偶尔贡献者。以下是您需要了解的内容:

curl(1) 本身对 Kerberos 一无所知,并且不会与您的凭据缓存或密钥表文件进行交互。它将所有调用委托给 GSS-API 实现,这将为您带来神奇效果。什么魔法取决于库、Heimdal 和 MIT Kerberos。

根据您的问题,我假设您对 Kerberos 知之甚少,只想自动执行 API 对 SPNEGO 保护的 REST 端点的调用。

这是您需要做的:

  1. 拥有类 Unix OS
  2. 至少安装 MIT Kerberos 1.11
  3. 针对 MIT Kerberos
  4. 至少安装 curl 7.38.0
  5. 通过 curl --version 提及 GSS-API SPNEGO 并与 ldd 链接到您的 MIT Kerberos 版本来验证这一点。
  6. 使用 ktutilmskutil
  7. 为服务主体创建一个 client keytab
  8. 尝试通过 kinit -k -t <path-to-keytab> <principal-from-keytab>
  9. 获取带有 客户端 密钥表的 TGT
  10. 使用 klist 验证您是否有票证缓存

环境现已准备就绪:

  1. 导出KRB5CCNAME=<some-non-default-path>
  2. 导出KRB5_CLIENT_KTNAME=<path-to-keytab>
  3. 调用curl --negotiate -u : <URL>

MIT Kerberos 将检测到两个环境变量都已设置,检查它们,使用您的密钥表自动获取 TGT,请求服务票证并传递给 curl。你完成了。

注意:这不适用于海姆达尔。

我使用的是 7.54.0 版本。以下命令对我来说很好用。 (请remember/pay注意协商选项前有双破折号)。

curl --negotiate -u: '<the_full_url>'