我需要用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的路径?
关于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。
$KRB5CCNAME
或以 /etc/krb5.conf
或由硬编码的默认值);否则提示用户密码,除非提示被JVM安全策略阻止(这是默认值,因为JVM无法猜测它是否需要UI提示或控制台提示)".你将需要覆盖它来从一个keytab创建一个私有的、内存中的票据;并且还需要一些没有被很好地记录下来的调整 -- 例如,参考那个帖子。https:/stackoverflow.coma425066205162372。
上面的帖子主要是关于JDBC的,但也适用于SPNego,但有两个注意事项。
com.sun.security.jgss.krb5.initiate
-Dsun.security.spnego.debug=true
另外,Oracle的那篇 "教程 "并没有涵盖keytab选项,但可能对上下文有用。https:/docs.oracle.comjavase8docstechnotesguidessecurityjgsslabpart6.html。
我最近实现了一个类似的东西,但不是用Java,而是用C++。
没有直接的方法来解决这个问题。做一个 kinit
留给了用户的责任。