我的要求如下:
Client1与Service1交互,Service1又与Service 2交互。与Service 2的交互应代表Client1进行。这里使用的身份验证是kerberos,我在客户端显式设置requestCredDelegation(true)时遇到的问题很少。 我以为S4U2 self + S4U2 Proxy kerberos扩展可以解决这个问题。
这些是我所做的事情:
a)在AD中,在Service1帐户上,为特定服务启用了受信任委派。如果service2是一个简单的java服务,Service1通过套接字连接到Service2,我不确定应该选择哪种服务类型。我选择“主机”作为服务类型。
b)在我的Service1 java代码中,在客户端< - >之后建立服务器连接: 1)我创建服务器凭据: serverCreds = manager.createCredential(null,GSSCredential.DEFAULT_LIFETIME,krb5Oid, GSSCredential.INITIATE_ONLY);;
2)。创建与客户端对应的GSSName GSSName other = manager.createName(XXX,GSSName.NT_USER_NAME,krb5Oid);
3)GSSCredential clientcreds =((ExtendedGSSCredential)serverCreds).impersonate(other);
假冒的客户信用证显示为:: [GSSCredential: client@domain.COM 1.2.840.113554.1.2.2发起[class sun.security.jgss.krb5.Krb5ProxyCredential] client@domain.COM 1.3.6.1.5.5.2发起[class sun.security.jgss.spnego.SpNegoCredElement]]
不确定SpNegoCredElement出现的原因,但我根本不使用该机制。
4)拥有模拟的凭证,我尝试通过创建上下文将服务1连接到服务2:
GSSContext context = manager.createContext(serverName, krb5Oid, impersonatedUserCredential, GSSContext.DEFAULT_LIFETIME); ....... context.initSecContext(token,0,token.length);
我收到错误,找不到有效凭据。
我已从模拟的凭据创建了一个主题,并尝试运行特权操作,但显示类似的错误,在主题中找不到服务票证。
我看到当通过传递凭据创建主题时,Krb5ProxyCredential被忽略,
“跳过的信用元素:sun.security.jgss.krb5.Krb5ProxyCredential@7e0babb1”
有人能告诉我,我在这里失踪了。感谢。