rest - curl:如何在 Windows 上使用 Kerberos 而不是 NTLM 身份验证?

标签 rest hadoop curl kerberos livy

我正在尝试连接到 Kerberos 安全性下的 Livy REST 服务。在 Linux CentoS 上,curlnegotiate 一起工作正常,在收到 Kerberos kinit 票据后连接通过

curl --negotiate -u : http://service_link

我面临的问题是尝试在远程 Windows 桌面上做同样的事情。我正在使用适用于 Windows 的 MIT Kerberos,它能够成功执行 kinit。但是,curl 似乎正在使用 NTLM SSL 票证而不是 Kerberos 进行协商,这会导致以下错误:

AuthenticationFilter: Authentication exception: org.apache.hadoop.security.authentication.client.AuthenticationException

我试过使用 official curl release for windows ,具有这些功能 (curl --version):

Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL libz TLS-SRP HTTP2 HTTPS-proxy

gow 0.8.0 version of curl :

Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM SPNEGO SSL SSPI libz

这两者在协商时都使用 NTLM SLL。

问题:有没有办法强制使用 Kerberos 而不是 NTLM?是否可以调试 Negotiator 以查看它是否(以及在哪里)寻找 Kerberos(并且可能看不到)票证?

关于 Kerberos,它似乎将 key 表存储在它的 api 上,所以我将 KRB5CCNAME 环境变量设置为 API:Initial default ccacheklist 能够看到票证,但是,也许 curl 需要额外的规范?

还有——对于这种与 Kerberos 安全性的连接,是否有替代方法来 curl

最佳答案

服务的名称及其后续的 SPN 对于理解 Kerberos AUTH 至关重要,并且可能非常棘手。要理解这个问题,您应该明白从 Web 服务器(或代理)返回的质询本质上是“我喜欢 Kerberos,给我一张票”……Web 服务器没有提供关于它会提供什么票的提示准备接受,也没有告诉客户如何获得合适的。

因此客户端需要计算出服务的名称(预期的 SPN),然后它需要一个 Kerberos 配置来告诉它如何获得合适的票证(如果不是从其本地 Kerberos 域)。

因此对于访问 http://www.github.com/ 的客户端SPN 将是 HTTP/www.github.com 但客户端首先需要检查该名称以查看其解析方式。它实际上是一个通过 github.com 解析的 CNAME,然后实际的 SPN 将是 HTTP/github.com - 然后客户端需要检查其 Kerberos 配置以查看该名称是否在外部 Kerberos 域中(这增加了额外的复杂性)。对于本地 kerberos 域,客户端将 krbtgt/@ 呈现给其本地 Kerberos 票证授予服务,请求 SPN HTTP/github.com @ 的票证。

如果 SPN 在 Local Kerberos Ticket Granting 服务中注册,那么它将颁发 Ticket,Client 将其呈现给 Web 站点。网站将接受它,前提是它具有正确的 SPN 和正确的发行域。

如果您连接到的 Web 服务实际上是 github.com 的本地伪造品,并且接受来自本地域的票证,那么这可能会起作用。但是对于您本地环境之外的网站,外国 Kerberos 域、配置和信任关系的额外复杂性将会发挥作用。

即使在您的本地环境中,客户端也需要能够从用于访问目标资源的名称中派生出正确的 SPN,并且 SPN 需要注册并与 Web 服务相关联(以便它可以解密 Kerberos出示门票)。

关于rest - curl:如何在 Windows 上使用 Kerberos 而不是 NTLM 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715990/

相关文章:

r - 如何使用默认 Web 代理设置配置 R 中的curl 包?

json - Grails从请求访问未映射到特定域的JSON属性

linux - Ubuntu 12.0.04 中的单节点 Hadoop 设置

hadoop - HortonWorks或Cloudera认证

java - 使用 Runtime.exec 从 JAVA 运行 hadoop jar 命令

Git http.cookiefile 配置选项不起作用

java - SOAP和Restful的区别和关系

java - Spring Data Rest & Spring Data Envers : How to expose REST API for Repository that extends Revision Repository

java - 我们可以使用 REST-Assured 框架设置多个 header 吗

ruby-on-rails - 在 windows xp(32 位)上的 Ruby on Rails 上安装 Typhoeus