当前位置: 首页 > 面试题库 >

如何通过GSS-API获取kerberos服务票证?

鞠隐水
2023-03-14
问题内容

有谁知道如何使用Java GSS-API从密钥分发中心(KDC)获取服务票证?

我有一个胖客户端应用程序,该应用程序首先使用Krb5LoginModule通过JAAS进行身份验证以从票证缓存中获取TGT(背景:Windows例如使用kerberos实现,并将票证授予票证存储在安全的存储区域中)。从LoginManager中,我获得包含TGT的Subject对象。现在,我希望当我为我的服务创建一个特定的GSSCredential对象时,该服务票证也将被放入主题的专用凭据中(我在网络上的某个地方已经读过)。因此,我尝试了以下方法:

// Exception handling ommitted
LoginContext lc = new LoginContext("HelloEjbClient", new DialogCallbackHandler());
lc.login()
Subject.doAs(lc.getSubject(), new PrivilegedAction() {

    public Object run() {
        GSSManager manager = GSSManager.getInstance();
        GSSName clientName = manager.createName("clientUser", GSSName.NT_USER_NAME);
        GSSCredential clientCreds = manager.createCredential(clientName, 8 * 3600, createKerberosOid(), GSSCredential.INITIATE_ONLY);

        GSSName serverName = manager.createName("myService@localhost", GSSName.NT_HOSTBASED_SERVICE);
        manager.createCredential(serverName, GSSCredential.INDEFINITE_LIFETIME, createKerberosOid(), GSSCredential.INITIATE_ONLY);
        return null;
    }

    private Oid createKerberosOid() {
        return new Oid("1.2.840.113554.1.2.2");
    }

});

不幸的是,我得到了GSSException:没有提供有效的凭据(机制级别:找不到任何Kerberos tgt)。


问题答案:

我对获得服务票的理解是错误的。我不需要从服务获取凭据-
在客户端上这是不可能的,因为客户端实际上没有服务器的TGT,因此没有权利获取服务凭据。这里只缺少创建一个新的GSSContext并将其初始化。如果我正确理解,则此方法的返回值包含服务票证。这是一个工作代码示例。它必须在PrivilegedAction中代表已登录的主题运行:

    GSSManager manager = GSSManager.getInstance();
    GSSName clientName = manager.createName("clientUser", GSSName.NT_USER_NAME);
    GSSCredential clientCred = manager.createCredential(clientName,
                                                        8 * 3600,
                                                        createKerberosOid(),
                                                        GSSCredential.INITIATE_ONLY);

    GSSName serverName = manager.createName("http@server", GSSName.NT_HOSTBASED_SERVICE);

    GSSContext context = manager.createContext(serverName,
                                               createKerberosOid(),
                                               clientCred,
                                               GSSContext.DEFAULT_LIFETIME);
    context.requestMutualAuth(true);
    context.requestConf(false);
    context.requestInteg(true);

    byte[] outToken = context.initSecContext(new byte[0], 0, 0);
    System.out.println(new BASE64Encoder().encode(outToken));
    context.dispose();

然后,outToken包含服务票证。但是,这不是使用GSS-API的方式。它的目标是将那些细节隐藏到代码中,因此最好在两侧都使用GSS-
API建立一个GSSContext。否则,由于存在潜在的安全漏洞,您真的应该知道您在做什么。有关更多信息,请比我更仔细地阅读有关使用kerberos的Sun
SSO教程

编辑:只是忘记了我正在使用Windows XP SP2。此版本的Windows中有一个新的“功能”,不允许在Windows
RAM中使用TGT。您必须编辑注册表以允许这样做。有关更多信息,请像我一样,在遇到“
KrbException:KDC不支持加密类型(14)”的情况下,请查看“
JGSS故障排除”页面主题。



 类似资料:
  • 我试图在使用JGit拉取回购时使用Kerberos身份验证,但出现以下错误: 来自Ticket Cache的空凭据 [Krb5LoginMoules]身份验证失败 这是我的登录名。形态 我使用自定义的JcshConfigSessionFactory和重写配置方法,如下所示 “klist”说凭证缓存是API(我在MacOS Sierra上)。我怎样才能克服这次失败?

  • 我已经编写了一个在Windows下运行的简单JavaHTTP客户端。客户端与需要通过SPNego进行Kerberos身份验证的Web服务器进行通信。 我遇到了两个问题: > 服务票证没有存储在我的凭据缓存中。执行请求后,我希望看到一个Kerberos服务票存储在我的凭据缓存下的

  • 问题内容: 我是reactjs / redux的初学者,找不到如何使用api调用在redux应用程序中检索数据的简单示例。我猜您可以使用jquery ajax调用,但是那里可能还有更好的选择? 问题答案: JSfiddle; http://jsfiddle.net/cdagli/b2uq8704/6/ 它使用redux,redux-thunk和fetch。 提取方法; 上面使用的动作: (注意:您

  • 我正在尝试从特定目录中的google工作表列表(大约570个工作表)中删除多余的行和列(已知范围)。 我能够使用google drive API获取电子表格Id。但是,修改页面的尺寸需要图纸Id。 我无法找到通过驱动器API(文件属性)检索此工作表ID的方法,也无法找到任何关于如何在电子表格中列出可用工作表的留档,因为我有电子表格ID。 我尝试使用谷歌应用程序脚本来达到我的目标,但运行时间已经超过

  • 目前,我已经开发了两个桌面应用程序,一个是另一个是。证书已存储在中,并标记为不可导出 我想通过库从eToken获取私钥,并将私钥转换或复制到内存流或字节数组结构中,然后将密钥对象传递给第三方加密API()进行数据加密/解密。 我如何从标记为不可导出的eToken查看或获取私钥?

  • 我想用retforIt从服务器得到响应。下面是一些代码: 怎么了?我在哪里可以找到改装文档?是什么?请帮忙