gpt4 book ai didi

java - Java 中对 Hadoop Kerberized 集群的 Http 请求

转载 作者:行者123 更新时间:2023-12-02 18:56:58 28 4
gpt4 key购买 nike

我需要使用 Kerberos 身份验证将 Http 请求发送到 Hadoop 集群,并且我想使用 Keytab 进行身份验证。
我通过 Apache 找到了一个库 HttpClient,我编写了这段代码来获取 HttpClient:

    private static CloseableHttpClient getHttpClient() {
CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials("YarnManager", "YarnManager")
);
return HttpClientBuilder.create()
.setDefaultCredentialsProvider(provider)
.build();
}

但我只能在我的 KeyTab 上执行 Kinit 命令后进行身份验证。
如何在 httpclient 中将路径传递给我的 keytab?
你知道其他图书馆可以这样做吗?

最佳答案

关于 Apache HttpClient:引用 Hadoop and Kerberos, the Madness beyond the Gate作者:Steve Loughran(从他不得不维护 hadoop-auth 库开始)

The Apache HTTP Client/http components have a well-deserved reputation for being great libraries to work with remote HTTP servers.
Should you use them for Kerberos/SPNEGO authenticated applications?

No.
(...)
Don't waste time or make things worse: go with the JDK libraries



关于基于 HTTP 的 Kerberos 身份验证:标准是使用 SPNego 它由每个体面的 HTTP 客户端以任何语言实现。并且通过任何严重的 HTTP 服务器或代理,尽管服务器端的设置更复杂。

Java 客户端的问题是, quoting Steve Lougran again ,

the public Java APIs are brittle across versions and JDKs ... Releases within a Java version may break the internals and/or the public API's behaviour.



这可以解释为什么“ native ”Java HTTP 客户端在 Kerberos 的 Java 实现方面比 Apache 更健壮,即 JAAS -- 如果您希望能够使用 key 表,这就是您需要配置的内容。

现在,Kerberos 的 Java 实现不仅脆弱,而且不完整(无法写入票证缓存,无法创建可更新票证等)并且没有很好的文档记录 -- quoting S.L. once more

JAAS is a nightmare from the Enterprise Java Bean era, one which surfaces from the depths to pull the unwary under
(...)
a single jaas.conf file can have multiple contexts ... Different contexts can have different login/auth mechanisms, including Kerberos and LDAP



有趣的事实:实际上,单个上下文可能定义多种机制(尝试第一个条目,如果尝试第二个不成功,等等)——并且对于每种机制,有多种获取凭据的方法。有关语法和更多引用,请参阅这些帖子:
https://stackoverflow.com/a/60507547/5162372
https://stackoverflow.com/a/45776704/5162372

AFAIK SPNego 的默认 JAAS 行为是“查看系统缓存(由 $KRB5CCNAME/etc/krb5.conf 或硬编码默认值定义);否则提示输入用户/密码,除非提示被 JVM 安全性阻止策略(这是默认设置,因为 JVM 无法猜测它是否需要 UI 提示或控制台提示)”。

您将需要覆盖它以从 key 表创建一个私有(private)的内存中票证;并且还需要一些没有很好记录的调整——参见。例如那个帖子
https://stackoverflow.com/a/42506620/5162372

上面的帖子关注 JDBC,但也适用于 SPNego,但有两个警告:
  • JAAS 部分必须标记为 com.sun.security.jgss.krb5.initiate
  • 有一个额外的调试标志 -Dsun.security.spnego.debug=true

  • 此外,Oracle 的“教程”不包括 keytab 选项,但可能对上下文有用:
    https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html

    关于java - Java 中对 Hadoop Kerberized 集群的 Http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61836090/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com