我有以下情况:
我有一台运行在Oracle数据库(带有Java SE 6)中的服务器,该服务器使用Apache HTTP客户端(Java)连接到Web服务。该网络服务需要使用Kerberos(即SPNEGO身份验证)进行保护。
我的服务器具有Kerberos主体,将随机密钥导出到密钥表,然后导入到数据库表中。
因此,我有一个带有多个关联的KerberosKey对象(每个加密方法一个)的KerberosPrincipal,我在主题中收集的所有信息。
我希望下一步是与KDC联系,以获取TGT并将其存储在Subject中。我怎么做?我在此找到的所有文档都假定这是在登录模块中发生的,但是在我的方案中没有登录。还是下面的其中一项会叫我KDC?
现在,我需要调用GSSManager.createCredential来创建GSSCredential,可以将其包装到KerberosCredentials和BasicCredentialsProvider中,然后可以将其添加到HttpClientContext中,以便HttpClient可以进行SPNEGO身份验证。
但是,如何将主题中的信息放入GSSCredential中?
最佳答案
在网上浏览了大约一周后,我终于找到了答案here。
该文档的摘录:
该应用程序调用JAAS登录名,而JAAS登录名又调用配置的Krb5LoginModule
Krb5LoginModule从KDC或从现有票证缓存中获取用户的TGT(KerberosTicket),并将该TGT存储在Subject的专用凭据集中
应用程序检索填充的Subject,然后调用Subject.doAs / doAsPrivileged,将其放置在执行ClientAction的线程的访问控制上下文中
ClientAction调用GSSManager.createCredential方法,并将其传递给期望的Mechs中的Kerberos V5 OID。
GSSManager.createCredential调用Kerberos V5 GSS-API提供程序,要求提供用于启动安全上下文的Kerberos凭据。
Kerberos提供程序从当前访问控制上下文中获取主题,并在其专用证书集中搜索代表用户TGT的有效KerberosTicket。
KerberosTicket返回到GSSManager,后者将其存储在GSSCredential容器实例中,以返回给调用方。