38

描述如何连接到 kerberos 安全端点的文档显示以下内容:

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

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

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

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

4

3 回答 3

65

作为该领域的偶尔贡献者curl。以下是您需要知道的:

curl(1)它本身对 Kerberos 一无所知,并且不会与您的凭证缓存或您的 keytab 文件进行交互。它将所有调用委托给 GSS-API 实现,这将为您带来魔力。什么魔法取决于图书馆、Heimdal 和 MIT Kerberos。

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

这是您需要做的:

  1. 拥有类似 Unix 的操作系统
  2. 至少安装 MIT Kerberos 1.11
  3. 针对 MIT Kerberos至少安装curl7.38.0
  4. curl --version通过提及 GSS-APISPNEGO 并ldd链接到您的 MIT Kerberos 版本来验证这一点。
  5. 使用or为服务主体创建客户端密钥表ktutilmskutil
  6. 尝试通过该客户端密钥表获取 TGTkinit -k -t <path-to-keytab> <principal-from-keytab>
  7. 验证klist您是否有票证缓存

环境现已准备就绪:

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

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

注意:这不适用于 Heimdal。

于 2016-07-29T18:03:21.227 回答
17
  1. 检查卷曲版本

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

  2. 使用登录kinit

    $ kinit <user-id>

  3. 使用卷曲

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

    “--negotiate”选项启用 SPNEGO

    "-u" 选项是必需的,但被忽略(使用 kinit 时指定的原则)

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

于 2016-07-21T18:19:47.423 回答
0

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

curl --negotiate -u: '<the_full_url>'
于 2021-11-05T14:25:45.343 回答