将 --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 会提示输入凭据?
如果它查找密钥表文件,该命令将查找什么文件名?
检查 curl 版本
$ curl -V
- 它应该支持功能 "GSS-Negotiate"
使用kinit
登录
$ kinit <user-id>
使用 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 端点的调用。
这是您需要做的:
- 拥有类 Unix OS
- 至少安装 MIT Kerberos 1.11
- 针对 MIT Kerberos
至少安装 curl
7.38.0
- 通过
curl --version
提及 GSS-API 和 SPNEGO 并与 ldd
链接到您的 MIT Kerberos 版本来验证这一点。
- 使用
ktutil
或 mskutil
为服务主体创建一个 client keytab
- 尝试通过
kinit -k -t <path-to-keytab> <principal-from-keytab>
获取带有 客户端 密钥表的 TGT
- 使用
klist
验证您是否有票证缓存
环境现已准备就绪:
- 导出
KRB5CCNAME=<some-non-default-path>
- 导出
KRB5_CLIENT_KTNAME=<path-to-keytab>
- 调用
curl --negotiate -u : <URL>
MIT Kerberos 将检测到两个环境变量都已设置,检查它们,使用您的密钥表自动获取 TGT,请求服务票证并传递给 curl
。你完成了。
注意:这不适用于海姆达尔。
我使用的是 7.54.0 版本。以下命令对我来说很好用。 (请remember/pay注意协商选项前有双破折号)。
curl --negotiate -u: '<the_full_url>'
描述如何连接到 kerberos 安全端点的 documentation 显示如下:
curl -i --negotiate -u : "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=..."
必须提供 -u
标志,但被 curl 忽略。
--negotiate
选项是否会导致 curl 查找预先使用 kinit
命令创建的密钥表,或者 curl 会提示输入凭据?
如果它查找密钥表文件,该命令将查找什么文件名?
检查 curl 版本
$ curl -V
- 它应该支持功能 "GSS-Negotiate"使用
登录kinit
$ kinit <user-id>
使用 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 端点的调用。
这是您需要做的:
- 拥有类 Unix OS
- 至少安装 MIT Kerberos 1.11
- 针对 MIT Kerberos 至少安装
- 通过
curl --version
提及 GSS-API 和 SPNEGO 并与ldd
链接到您的 MIT Kerberos 版本来验证这一点。 - 使用
ktutil
或mskutil
为服务主体创建一个 client keytab
- 尝试通过
kinit -k -t <path-to-keytab> <principal-from-keytab>
获取带有 客户端 密钥表的 TGT
- 使用
klist
验证您是否有票证缓存
curl
7.38.0
环境现已准备就绪:
- 导出
KRB5CCNAME=<some-non-default-path>
- 导出
KRB5_CLIENT_KTNAME=<path-to-keytab>
- 调用
curl --negotiate -u : <URL>
MIT Kerberos 将检测到两个环境变量都已设置,检查它们,使用您的密钥表自动获取 TGT,请求服务票证并传递给 curl
。你完成了。
注意:这不适用于海姆达尔。
我使用的是 7.54.0 版本。以下命令对我来说很好用。 (请remember/pay注意协商选项前有双破折号)。
curl --negotiate -u: '<the_full_url>'