在Java中向Hadoop Kerberized Cluster提出Http请求。

问题描述 投票:0回答:1

我需要用Kerberos auth向Hadoop Cluster发送Http请求,并且我想用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的路径?

java hadoop httpclient kerberos
1个回答
1
投票

关于Apache HttpClient:引用 Hadoop和Kerberos,门外的疯狂。 由史蒂夫-洛夫兰(从他不得不维护的时候开始)。hadoop-auth 库)。)

Apache HTTP Clienthttp组件是当之无愧的与远程HTTP服务器合作的优秀库。 你应该将它们用于 KerberosSPNEGO 认证的应用程序吗?

不应该。 (...) 不要浪费时间,也不要让事情变得更糟:使用 JDK 库。


关于HTTP上的Kerberos auth:标准是使用 SPNego 任何语言的HTTP客户端都可以实现。任何严肃的HTTP服务器或代理服务器都可以实现,尽管服务器端的设置比较复杂。

关于Java客户端的问题是。再次引用Steve Lougran的话,

公共的Java APIs在不同的版本和JDK中是很脆弱的。在一个Java版本中发布的版本可能会破坏内部结构或公共API的行为。

这也解释了为什么 "原生的 "Java HTTP客户端比Apache客户端更强大,当涉及到Kerberos的Java实现,即 JAAS -- 如果你想使用 keytab,就需要配置这个。

现在,Kerberos 的 Java 实现不仅是脆弱的,而且是不完整的 (没有办法写入票据缓存,没有办法创建可续票据等) 而没有充分的记录 -- -- 再次引用S.L.的话

JAAS是企业级Java Bean时代的噩梦,它从深处浮出水面,将不小心的人拉下水。(...) 单一 jaas.conf 文件可以有多个上下文......。不同的上下文可以有不同的loginauth机制,包括Kerberos和LDAP。

有趣的是:实际上,一个上下文可以定义多个机制(第一条被尝试,如果不成功,第二条被尝试等等)--对于每个机制,可以定义多种获取凭证的方式。语法&更多参考请看这些帖子。https:/stackoverflow.coma605075475162372 https:/stackoverflow.coma457767045162372。


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

你将需要覆盖它来从一个keytab创建一个私有的、内存中的票据;并且还需要一些没有被很好地记录下来的调整 -- 例如,参考那个帖子。https:/stackoverflow.coma425066205162372。

上面的帖子主要是关于JDBC的,但也适用于SPNego,但有两个注意事项。

  • JAAS部分必须标明 com.sun.security.jgss.krb5.initiate
  • 有一个额外的调试标志 -Dsun.security.spnego.debug=true

另外,Oracle的那篇 "教程 "并没有涵盖keytab选项,但可能对上下文有用。https:/docs.oracle.comjavase8docstechnotesguidessecurityjgsslabpart6.html。


0
投票

我最近实现了一个类似的东西,但不是用Java,而是用C++。

没有直接的方法来解决这个问题。做一个 kinit 留给了用户的责任。

© www.soinside.com 2019 - 2024. All rights reserved.