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

SrcName为空的GSSContext

穆鸿卓
2023-03-14

我正在使用基于Windows域登录的SSO的web appliaction,为此,我选择验证Kerberos票据。但现在我面临着一个我找不到解决办法的问题。我设法在没有异常的情况下验证了票证,但是当我试图获取用户名时,抛出NullPointerException,因为用户名为Null,我不知道问题出在哪里。

我基于以下内容创建客户端:

使用GSSManager验证Kerberos票据

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

如何设置内容,只需在此复制粘贴表单https://stackoverflow.com/a/25450862/1646082:

final Oid spnegoOid = new Oid("1.3.6.1.5.5.2");

GSSManager gssmgr = GSSManager.getInstance();

// tell the GSSManager the Kerberos name of the service
GSSName serviceName = gssmgr.createName(this.servicePrincipal, GSSName.NT_USER_NAME);

// get the service's credentials. note that this run() method was called by Subject.doAs(),
// so the service's credentials (Service Principal Name and password) are already
// available in the Subject
GSSCredential serviceCredentials = gssmgr.createCredential(serviceName,
        GSSCredential.INDEFINITE_LIFETIME, spnegoOid, GSSCredential.ACCEPT_ONLY);

// create a security context for decrypting the service ticket
GSSContext gssContext = gssmgr.createContext(serviceCredentials);

// decrypt the service ticket
System.out.println("Entering accpetSecContext...");
System.out.println( new String (Base64.encodeBase64( gssContext.acceptSecContext(this.kerberosTicket, 0,
        this.kerberosTicket.length) ) ));

// get the client name from the decrypted service ticket
// note that Active Directory created the service ticket, so we can trust it
String clientName = gssContext.getSrcName().toString();

更新2:

如果我基于https://spring.io/blog/2009/09/28/spring-security-kerberos-spnego-extension设置spring security,我也会遇到同样的错误:

private static class KerberosValidateAction implements PrivilegedExceptionAction<String> {
    byte[] kerberosTicket;

    public KerberosValidateAction(byte[] kerberosTicket) {
        this.kerberosTicket = kerberosTicket;
    }

    @Override
    public String run() throws Exception {
        GSSContext context = GSSManager.getInstance().createContext((GSSCredential) null);
        context.acceptSecContext(kerberosTicket, 0, kerberosTicket.length);
        String user = context.getSrcName().toString(); // ERROR!
        context.dispose();
        return user;
    }

}

首先。不要使用Java1.8b40和b45,它们都坏了。而且不要在本地PC上测试,它不起作用(我不知道为什么)。

在最新的(b65)Java版本上更改后,我遇到了关于入侵的异常(找不到合适类型的密钥来解密AP rep-AES256...)。我已经通过Java Cryptography Extension(JCE)for Java1.8修复了这个问题,并使用/crypto AES256-SHA1重新创建keytab。在所有这些之后,我遇到了异常:

GSSException:在sun.security.jgss.krb5.krb5context.acceptseccontext(未知源)在sun.security.jgss.gsscontextimpl.acceptseccontext(未知源)在sun.security.jgss.gsscontextimpl.acceptseccontext(未知源)在sun.security.krb5.encrypteddata.decrypt(未知源)sun.security.krb5.krbaPreq.authenticate(未知源)sun.security.krb5.krb5.krbaPreq.(未知源)sun.security.jgss.krb5.initsectextToken.(未知源).........................................................解密(扣篮nown来源)...还有14个

我尝试了这个教程和其他html" target="_blank">方法来创建keytabfile,但我仍然没有解决方案。

共有1个答案

郎成弘
2023-03-14

在实现我的GSSAPI套接字演示时,我遇到了同样的checksum failed错误,这是对Oracle GSSAPI教程代码的修改。我在一台注册到FreeIPA kerberos领域的Linux机器上执行代码。我使用了我的Linux系统的普通krb5.conf文件。对ticketetype没有限制:

...
[libdefaults]
  default_realm = AUTHDEMO.IT
  dns_lookup_realm = true
  dns_lookup_kdc = true
  rdns = false
  ticket_lifetime = 24h
  forwardable = true
  udp_preference_limit = 0 
...

FreeIPA领域的默认值是使用类型18票(AES-256)。

关于我的应用程序,它配置了以下策略文件:

grant CodeBase "file:./app.jar" {
        permission java.security.AllPermission;
};

grant CodeBase "file:./app.jar" 
    Principal javax.security.auth.kerberos.KerberosPrincipal 
        "servicename@AUTHDEMO.IT" {

    permission java.net.SocketPermission "*", "accept";

    permission javax.security.auth.kerberos.ServicePermission
        "servicename@AUTHDEMO.IT", "accept";
};
DemoServer {
  com.sun.security.auth.module.Krb5LoginModule required
   principal="servicename@AUTHDEMO.IT"
   storeKey=true
   debug=true; #not mandatory
};

使用此配置,接受者端不会出现任何问题,应用程序能够检查服务票证的有效性并接受连接。

我问自己..为什么?

我检查了用两种配置获得的主题的差异。在工作情况下,对于配置文件,主题将密码散列凭据和主体TGT票证都包含在私有凭据中。使用DConfig,我只使用密码哈希值获得一个主题,但在私有凭据中没有主体TGT票证。

我的分是...在Jaas登录之后,让我们检查您的主题私有凭据是否缺少CRED(您需要将服务主体TGT放入您的接受者端subject!)在这种情况下,也尝试在接受方设置isinitiator=true

问候

 类似资料:
  • 问题内容: 在Java代码中执行空检查时,如果您为空值抛出IllegalArgumentExceptions,那么您将使用哪种消息模板? 我们倾向于使用这样的东西 哪个更好:“ is null”或“ was null”,为什么? 对我来说,“是空的”感觉更自然。 问题答案: 由于由于失败的前提条件检查而引发,因此,我认为除了陈述事实以外,还应说明已违反的 要求 。 就是说,而不是说。 关于使用库进

  • 我有返回给我一些JSON后端。 我将其解析为我的类: 然后我从服务器(使用rxJava)检索数据,没有任何错误。但是我预料到了一个错误,因为我认为我应该做这样的事情(以防止GSON转换器错误,因为在我的JSON响应中不存在): 在从后端接收数据并将其解析到带有构造函数的SomeData类(不带def值)之后,notNullableValue的值==NULL。 据我所知,在Kotlin中不是可空值可

  • 问题内容: 我正在运行,并且在.htaccess文件中执行了以下操作: 如果我在PHP文件中打印出变量,则会得到一个空数组。为什么我的环境变量没有出现在这里?为什么首先是空的? 我确实找到了变量,但是它出现在变量中。由于某种原因,它出现了两次。为什么是这样? 看来我可以使用来获得它,所以也许我应该只使用它。但是我仍然对造成这种情况的原因有些好奇。这是Windows问题吗?还是发生了什么事? 问题答

  • 我在QuartzJobs实例上使用EntityManager遇到此问题: Java语言weblogic上的lang.NullPointerException。坚持不懈CICScopedImprovider。weblogic上的getEMForCurrentCIC(CICScopedImprovider.java:35)。坚持不懈事务实体管理器Proxy Impl。weblogic上的getPers

  • 问题内容: XML文件 有人知道为什么返回null吗? 问题答案: 您的HTTP请求是异步的。只有具有的值时,它才有价值。 另外,我认为您不需要排队。必须提供XML MIME类型才能响应,而不是请求。另外,请遵守良好的编码习惯(不要忘记,DRY等)

  • 我有使用spring boot、spring security和spring data的web应用程序。它是无国籍的。 我想避免总是调用db进行用户访问。所以我想使用SpringCacheBasedUserCache。 我有一个类谁实现用户细节和另一个谁实现用户细节服务 在loadUserByUsername方法中,userCache为空