使用--negotiate with curl时,是否需要keytab文件?

Chr*_*now 25 curl hadoop kerberos webhdfs keytab

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

curl -i --negotiate -u : "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=..."
Run Code Online (Sandbox Code Playgroud)

-u必须提供该标志,但curl会忽略该标志.

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

如果它查找keytab文件,该命令将查找哪个文件名?

Mic*_*l-O 45

成为该领域的一次性贡献者curl.以下是您需要了解的内容:

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

根据您的问题,我假设您对Kerberos知之甚少,并希望自动对SPNEGO保护的REST端点进行API调用.

这是你需要做的:

  1. 拥有类Unix操作系统
  2. 至少安装MIT Kerberos 1.11
  3. curl针对MIT Kerberos 安装至少7.38.0
  4. 通过curl --version提及GSS-API SPNEGO并与ldd您的MIT Kerberos版本链接来验证这一点.
  5. 使用或为服务主体创建客户机密钥表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将检测到两个环境变量都已设置,检查它们,使用您的keytab自动获取TGT,请求服务票证并传递给curl.你完成了.

注意:这不适用于Heimdal.

  • 您能否详细说明在第 3 步中我们如何针对 MIT Kerberos 安装curl? (2认同)
  • @displayName 充其量,您的操作系统包管理器将为您执行此操作。最坏的情况下,您需要将“krb5-config”的路径传递给curl的配置脚本。就是这样。 (2认同)
  • @wheeler 一个较晚的答案,但您将其设置为 kerberos 缓存文件的路径,例如“export KRB5CCNAME=/tmp/krb5cc_1000”。使用 kinit 后,会自动创建缓存,您可以使用 `klist` 找到它: __Ticket cache: FILE:/tmp/krb5cc_1000__ (2认同)

Avi*_*ddy 10

  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

    " - 谈判"选项启用SPNEGO

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

    "-b"和"-c"选项用于存储和发送http cookie.

  • 这对我来说效果很好,并且比接受的答案少了很多设置/麻烦。curl 7.35.0,没有 SPNEGO,只有 GSS-Negotiate。 (2认同)
  • 回答我自己:如果没有 cookiejar,即使 Kerberos 部分成功,http 也会无限重定向。 (2认同)