描述如何连接到kerberos安全端点的文档显示以下内容:
curl -i --negotiate -u : "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=..."
必须提供-u
标志,但curl忽略了该标志。
--negotiate
选项是否会导致curl查找预先使用kinit
命令创建的keytab,或者curl会提示输入凭据?
如果要查找keytab文件,命令要查找的文件名是什么?
在该地区成为curl
的贡献者。以下是您需要了解的内容:
curl(1)
本身对Kerberos一无所知,不会与您的凭据缓存或keytab文件交互。它将把所有调用委托给GSS-API实现,这将为您带来魔力。什么魔术取决于库、Heimdal和MIT Kerberos。
根据您的问题,我假设您对Kerberos知之甚少,只想自动化对由SPNEGO保护的REST端点的API调用。
以下是您需要做的:
- 拥有类似Unix的操作系统
- 至少安装MIT Kerberos 1.11
- 针对MIT Kerberos安装至少
curl
7.38.0 - 请使用提及GSS-API和SPNEGO的
curl --version
以及针对MIT Kerberos版本链接的ldd
对此进行验证 - 使用
ktutil
或mskutil
为服务主体创建客户端键选项卡 - 尝试通过
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将检测两个环境变量是否已设置,检查它们,使用您的keytab自动获取TGT,请求服务票证并传递给curl
。你完了。
注意:这将不适用于Heimdal。
-
检查卷曲版本
$ curl -V
-应支持"GSS协商"功能 -
使用
kinit
登录$ kinit <user-id>
-
使用卷曲
$ curl --negotiate -u : -b ~/cookiejar.txt -c ~/cookiejar.txt http://localhost:14000/webhdfs/v1/?op=liststatus
"--协商"选项启用SPNEGO
"-u"选项是必需的,但被忽略(使用kinit期间指定的原理)
"-b"&"-c"选项用于存储和发送http cookie。
我使用的是7.54.0版本。以下命令对我来说很好。(请记住/注意,协商选项之前有双破折号)。
curl --negotiate -u: '<the_full_url>'