Java 8 使用Java8S4U2Proxy-需要一个很好的示例

Java 8 使用Java8S4U2Proxy-需要一个很好的示例,java-8,kerberos,Java 8,Kerberos,我正在尝试使用Java8中引入的S4U2Proxy。不幸的是,我没有成功地找到这些例子。我的要求是客户将发送其证书。然后我应该委托(使用kerberos)他的请求,连接到KDC,获取TGT,获取服务票证以代表用户联系另一个服务器,然后通过提供服务票证最终联系实际的服务。如果Java8没有提供一个干净的方法,你能告诉我其他的实用程序可以解决我的需求吗 Subject.doAs(subject, new PrivilegedAction<Object>() { @Over

我正在尝试使用Java8中引入的S4U2Proxy。不幸的是,我没有成功地找到这些例子。我的要求是客户将发送其证书。然后我应该委托(使用kerberos)他的请求,连接到KDC,获取TGT,获取服务票证以代表用户联系另一个服务器,然后通过提供服务票证最终联系实际的服务。如果Java8没有提供一个干净的方法,你能告诉我其他的实用程序可以解决我的需求吗

Subject.doAs(subject, new PrivilegedAction<Object>() {
        @Override
        public Object run() {
            GSSManager manager = GSSManager.getInstance();
            GSSCredential self  = null;
            try {
                GSSName selfUser = manager.createName("serviceWhoWantstoImpersonate", GSSName.NT_USER_NAME);
                Oid krb5Oid = new Oid( "1.2.840.113554.1.2.2");
                self = manager.createCredential(selfUser.canonicalize(krb5Oid), GSSCredential.DEFAULT_LIFETIME, krb5Oid, GSSCredential.INITIATE_ONLY);
                GSSName user = manager.createName(clientName, GSSName.NT_USER_NAME);
                GSSCredential impCred = ((ExtendedGSSCredential) self).impersonate(user);
            } catch (GSSException e) {
                e.printStackTrace();
            }

            return null;
        }
    });
Subject.doAs(Subject,newprivilegedaction(){
@凌驾
公共对象运行(){
GSSManager manager=GSSManager.getInstance();
GSSCredential self=null;
试一试{
GSSName selfUser=manager.createName(“servicehowantstoimpersonate”,GSSName.NT\u USER\u NAME);
Oid krb5Oid=新Oid(“1.2.840.113554.1.2.2”);
self=manager.createCredential(selfUser.canonicalize(krb5Oid)、GSSCredential.DEFAULT_生存期、krb5Oid、GSSCredential.INITIATE_仅);
GSSName user=manager.createName(clientName,GSSName.NT\u user\u NAME);
GSSCredential impCred=((扩展GSSCredential)self).模拟(用户);
}捕获(GSE){
e、 printStackTrace();
}
返回null;
}
});
显然,会有关于如何在KDC中设置SPN的问题?该服务帐户是否被授权进行授权?是否已将正确的SPN分配给该服务帐户?当用户“monkey”拒绝所有类型的委托时?等等。现在我觉得我在KDC中做了正确的设置。我的问题是上面的问题甚至在它到达KDC之前就发生了。任何有效的输入都会有所帮助

编辑: 经过一些研究,我能够使用Java8执行S4u2self和s4u2proxy。令人惊讶的是,Oracle文档至少提供了一个示例。无论如何,我现在正进入下一个阶段。
现在我必须处理的另一个场景是跨域kerberos证书委派。从我到目前为止看到的Java8文档中,可以推断当前不支持跨领域。这仍然是真的吗?

我已经为Java 8中的Kerberos SFU扩展功能构建了一个完整的独立演示应用程序:

以下是允许为模拟用户生成带有TGS票证的SPNEGO令牌的简短代码段:

GSSManager manager = GSSManager.getInstance();
GSSName userName = manager.createName("targetUser", GSSName.NT_USER_NAME);
GSSCredential impersonatedUserCreds =
  ((ExtendedGSSCredential)serviceCredentials).impersonate(userName);

final Oid KRB5_PRINCIPAL_OID = new Oid("1.2.840.113554.1.2.2.1");
GSSName servicePrincipal =
  manager.createName("HTTP/webservice-host.domain.ltd", KRB5_PRINCIPAL_OID);
ExtendedGSSContext extendedContext =
  (ExtendedGSSContext) manager.createContext(servicePrincipal,
                                             new Oid("1.3.6.1.5.5.2"),
                                             impersonatedUserCreds,
                                             GSSContext.DEFAULT_LIFETIME);
final byte[] token = extendedContext.initSecContext(new byte[0], 0, 0);
注意,尚未建立扩展上下文。可能需要与服务器进行多轮对话

尚不支持跨领域模拟:请参阅

Java服务帐户可以托管在一个域中,只要该域被明确地附加到SPN中,该代码就可以针对另一个域中的服务,如HTTP/webservice-host.otherdomain。ltd@OTHERDOMAIN.LTD


与其他领域中已知的用户相同,您应该在方法
createName(“targetUser@OTHERDOMAIN.LTD,GSSName.NT\u用户名)

有人有任何解决方案吗?有没有可能通过代码片段得到答案?我在这里总结了所有必要的细节:GitHub上的演示代码包含一些错误。我将就此提出一个问题。@Yves-您知道Java是否支持跨领域模拟和受约束的委托吗?它似乎不受支持,但我想知道为什么它不受支持。@ItestonlyinProd为了支持跨领域约束的委托,ActiveDirectory中的一些高级配置必须通过powershell操作完成。。。但我还没有真正测试过(事实上可能是本周)@YvesMartin让我知道你在研究中发现了什么。非常感谢你的帮助@manish I最终进行了调查,但Java 8(以及Java 9)中缺少实现。。。因此,即使最近提出了一个补丁,目前也不可能: