使用Kerberos认证从服务器下载文件

5

我想要从Linux shell脚本中下载一个通过https保护并且需要kerberos身份验证的网站文件。我已经尝试过使用wget和curl,但似乎都不支持https上的kerberos。

有没有一款支持https上的kerberos的Linux命令行工具?如果有,如何使用它?


抱歉,这不是一个编程问题,我建议将其转移到http://superuser.com/,或者您可以“标记”它并请求管理员移动。 (我没有对您的问题进行投票)。祝你好运。 - shellter
脚本编写与编程不同的是什么?如果需要将此问题移至其他网站,我认为将其放在serverfault.com上比放在superuser.com上更合适。 - Alex Q
1
你遇到的是工具问题,而不是编程问题。 - Michael-O
3个回答

11

如果curl支持GSS-Negotiate,那么完全可以使用curl进行操作。使用curl -V命令检查是否返回带有Features行的结果中包含GSS-Negotiate(Ubuntu 12.04已经包含此功能)。您还需要Kerberos客户端工具(例如Ubuntu上的krb5-user),并设置您的/etc/krb5.conf文件中的REALM和kdc。请参阅MIT文档

首先,您必须能够从与Web服务器使用相同的KDC获取票证(忽略更复杂的情况)。您要获取的域名还必须有一个逆向指针或在您的/etc/hosts中进行配置,以便检查您的DNS是否正确。

使用kinit <some user principal>开始操作。

然后,您可以使用curl到达想要检查的URL位置。为curl提供一个fake用户是必需的,以便接受您的协商(但实际上未使用,用户名和密码不重要)。我还使用--trace-ascii-参数以获取Kerberos错误信息。

例如:

 curl  --negotiate -u foo --trace-ascii -  http://intranet/

如果你看到:

== Info: gss_init_sec_context() failed: : Credentials cache file '/tmp/krb5cc_0' not found<= Recv header, 29 bytes (0x1d)

那么您可能忘记了kinit或它没有成功。

如果您看到类似于此的内容,但带有krb5kdc_err_s_principal_unknown,则Kerberos库构建的名称具有反向指针或主机条目,在连接的KDC上没有相应的主体。

否则,如果服务器发送适当的HTTP/1.1 401:需要授权WWW-Authenticate: Negotiate,则您将得到身份验证。


很好的回答。有哪些公共yum存储库预先构建了带有GSS-Negotiate的curl/libcurl? - Tagar
1
在 Fedora 29 中,这对我有效,但会提示输入密码(然后可以是任何内容)。不要使用 foo,而是使用 -u:(其中 : 是一个空的虚假用户名和密码)。 - mattdm
有趣。可能是Web服务器也发送了WWW-Authenticate:Basic头吗? - Gerrit

5

请查看curl的手册页。您可以使用--negotiate参数使用SPNego / GSSAPI / Kerberos。大多数Web服务器都支持SPNego。


1

curl支持SPNEGO,如果您使用fbopenssl编译它,就可以实现该功能,因为没有内置的支持。我已经这样做了,它可以正常工作。


curl的RPM spec文件中有一个注释,它说明从版本7.38.0开始:“不再使用fbopenssl做任何事情”。 - slm
1
@slm,那是正确的,我和其他一些人当时显著改善了curl的SPNEGO支持。 - Michael-O
感谢您的工作,当我开始尝试构建7.37版本时,并不是完全清楚的,直到我找到了.spec文件并意识到在后来的版本7.38+中,由于不再需要获取FBOpenSSL,因此构建SPNEGO现在变得更加容易。鉴于这一点,该回答是否应根据当前状态进行更新或澄清它取决于您使用的curl版本? - slm
@slm。没问题,请继续编辑我的回答。我会批准更改。 - Michael-O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接