当前位置: 首页 > 知识库问答 >
问题:

生成SPNEGO令牌失败

钮安歌
2023-03-14

我试图生成令牌,该令牌可以用作HTTP头,以验证HDFS WebHDFS URL和Oozie REST API URL。我引用了下面的url以生成协商令牌的以下代码。https://www.ibm.com/support/knowledgecenter/en/SS7JFU_8.5.5/com.ibm.websphere.express.doc/ae/tsec_SPNEGO_token.html

public class TokenCreation {
  private static final String SPNEGO_OID = "1.3.6.1.5.5.2";
  private static final String KERBEROS_OID = "1.2.840.113554.1.2.2";
  public static byte[] genToken(String principal) {
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
    byte[] spnegoToken = new byte[0];
    try {
      Oid spnegoMechOid = new Oid(SPNEGO_OID);
      Oid krb5MechOid = new Oid(KERBEROS_OID);
      GSSCredential clientGssCreds = null;
      GSSManager manager = GSSManager.getInstance();
      GSSName gssUserName = manager.createName(principal, GSSName.NT_USER_NAME, krb5MechOid);
      clientGssCreds = manager.createCredential(gssUserName.canonicalize(krb5MechOid),
          GSSCredential.INDEFINITE_LIFETIME,
          krb5MechOid,
          GSSCredential.INITIATE_ONLY);
      clientGssCreds.add(gssUserName,
          GSSCredential.INDEFINITE_LIFETIME,
          GSSCredential.INDEFINITE_LIFETIME,
          spnegoMechOid, GSSCredential.INITIATE_ONLY);
      GSSName gssServerName = manager.createName(principal, GSSName.NT_USER_NAME);
      GSSContext clientContext = manager.createContext(gssServerName.canonicalize(spnegoMechOid),
          spnegoMechOid,
          clientGssCreds,
          GSSContext.DEFAULT_LIFETIME);
      // optional enable GSS credential delegation
      clientContext.requestCredDeleg(true);
      // create a SPNEGO token for the target server
      spnegoToken = clientContext.initSecContext(spnegoToken, 0, spnegoToken.length);
    } catch (GSSException e) {
      e.printStackTrace();
    }
    return spnegoToken;
  }

但在运行上述代码后,我总是得到以下提示:

2019-09-25 14:12:51 760 [INFO] [pool-2-thread-1] c.s.n.c.u.security.KrbUtils - after loginUserFromKeytab............AtoimcUser:HTTP/host1.exmaple.com@EXAMPLE.COM
2019-09-25 14:12:51 760 [INFO] [pool-2-thread-1] c.s.n.app.oozie.OozieAppCaller - ->>>>>>User Name is HTTP/host1.exmaple.com@EXAMPLE.COM
2019-09-25 14:12:51 760 [INFO] [pool-2-thread-1] c.s.n.app.oozie.OozieAppCaller - ->>>>>>Mode is KERBEROS
>>>KinitOptions cache name is /tmp/krb5cc_0
Kerberos username [root]: ^C^C^C
Kerberos password for root:

您可以在上述输出日志的末尾看到。“Kerberos用户名”总是提示询问用户名。

此外,我还尝试手动运行kinit键。上述类可以成功生成令牌。但是手动运行kinit并不是我想要的方式。

你能帮忙吗?谢谢

共有1个答案

孔礼骞
2023-03-14

Kerberos和SPNEGO支持Java很麻烦。

我创建了一个小型库来简化一些Kerberos用例:https://github.com/bedrin/kerb4j您可以这样使用它来生成SPNEGO令牌:

SpnegoClient spnegoClient = SpnegoClient.loginWithKeyTab("svc_consumer", "/opt/myapp/consumer.keytab");
URL url = new URL("http://api.provider.acme.com/api/operation1");
SpnegoContext context = spnegoClient.createContext("http://provider.acme.com"); // Will result in HTTP/provider.acme.com SPN
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", context.createTokenAsAuthroizationHeader());
 类似资料:
  • 问题内容: 我正在尝试使用Elasticsearch来实现自动完成功能,因为我知道该怎么做… 我正在尝试在索引已爬网数据时使用ES的edge_n_grams建立多词(短语)建议。 a 和a 之间有什么区别-我已经阅读了有关这些文档,但仍需要更多了解…。 例如,token_filter是ES用来针对用户输入进行搜索的内容吗?ES用于制作令牌的令牌生成器是吗?什么是代币? ES是否可以使用其中任何一种

  • 问题内容: 我正在使用Apache Oltu框架实现OAuth 2.0提供程序服务器,以寻找有关如何在Java中生成访问令牌和秘密令牌的想法。请指教。 问题答案: OAuth 2.0 规范并未说明如何生成令牌和秘密令牌。因此,由您决定是使用一些现有的/锚定数据来生成令牌,还是要使用随机序列来生成令牌。唯一的区别是,如果您使用大概已知的数据(例如,用户数据,例如用户名,创建日期等),则可以在需要时随

  • 我一直在尝试使用简单的REST客户端以及Mozilla的REST插件。我收到“HTTP/1.1 401未授权”响应,正文中带有“{”error:“unauthorized_client”、“error_description”:“客户端未授权”}。 我已经成功获取了auth码,下面是访问令牌的POST请求,(范围r_fullprofile) https://www.linkedin.com/uas

  • https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=your_app_client_id&response_type=code&redirect_uri=https%3a%2f%2flogin.microsoftonline.com%2fcommon%2foauth2%2fnativeclient&res

  • 问题内容: 为了生成用于访问我们的API的32个字符的令牌,我们目前使用: 我已经读到,这种方法不是基于密码的安全性,因为它基于系统时钟,这将是一个更好的解决方案,因为它很难预测。 如果是这种情况,等效代码将是什么样? 我猜是这样的,但是我不知道这是否对… 我应该传递给函数什么长度也有意义? 问题答案: 这是正确的解决方案:

  • 我有一个计划的WebJob,每天运行,检查数据库中所有用户的密码过期日期。如果密码到期日是今天,它将生成密码重置令牌并通过电子邮件发送给用户。然后用户单击电子邮件中的url,并被带到一个网站,在那里输入新密码。 我设法在我的WebWork中生成一个令牌,并通过电子邮件发送。但是,通过我的Asp重置密码时。NET网站我得到无效令牌。我不明白为什么。我假设它一定与我的WebWork中的令牌提供商有关。