gpt4 book ai didi

java - SrcName 为空的 GSSContext

转载 作者:搜寻专家 更新时间:2023-10-31 20:18:12 27 4
gpt4 key购买 nike

我正在使用基于 Windows 域登录的 SSO 网络应用程序,为此我选择验证 Kerberos 票证。但是现在我遇到了一个找不到解决方案的问题。我设法无一异常(exception)地验证票证,但是当我尝试获取用户名时,抛出了 NullPointerException,因为用户名是 null 并且我不知道在哪里是问题。

为什么我在验证过程中没有得到任何异常,但用户名是空的?

我如何获得用户名:String clientName = gssContext.getSrcName().toString();

我基于此创建我的客户端:

Using GSSManager to validate a Kerberos ticket

How to obtain a kerberos service ticket via GSS-API?

http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/single-signon.html

更新 1:

我如何设置内容,只需在此处复制粘贴表格 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我也遇到了同样的错误:

java.lang.NullPointerException at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:136) at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:125) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422)

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;
}

}

更新 3:

还尝试按照此处的建议将 Java 版本从 1.8 更改为 1.7 Domain authentication with Kerberos fails .没有结果。

更新 4:

首先。不要使用 Java 1.8 b40 和 b45,它们都已损坏。并且不要在本地PC上测试它,它不起作用(我不知道为什么)。

更改最新的 (b65) Java 版本后,我遇到有关加密的异常(无法找到适当类型的 key 来解密 AP REP - AES256 ...)。我已经通过 Java 1.8 的 Java 加密扩展 (JCE) 修复了这个问题,并使用 /crypto AES256-SHA1 重新创建了 key 表,毕竟我得到了异常:

GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed) at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Unknown Source) at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) at GssServer$GssServerAction.run(GssServer.java:159) ... 4 more Caused by: KrbException: Checksum failed at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source) at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source) at sun.security.krb5.EncryptedData.decrypt(Unknown Source) at sun.security.krb5.KrbApReq.authenticate(Unknown Source) at sun.security.krb5.KrbApReq.(Unknown Source) at sun.security.jgss.krb5.InitSecContextToken.(Unknown Source) ... 8 more Caused by: java.security.GeneralSecurityException: Checksum failed at sun.security.krb5.internal.crypto.dk.ArcFourCrypto.decrypt(Unknown Source) at sun.security.krb5.internal.crypto.ArcFourHmac.decrypt(Unknown Source) ... 14 more

我试过了 this tutorial和其他创建 key 表文件的方法,但我仍然没有解决方案。

最佳答案

我在实现我的 GSSAPI 套接字演示时遇到了同样的Checksum failed 错误,该演示是对 Oracle GSSAPI 的修改 tutorial代码。我在注册到 FreeIPA kerberos 领域的 Linux 机器上执行了我的代码。我使用了我的 Linux 系统的 vanilla krb5.conf 文件。对票 etype 没有限制:

...
[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";
};

在执行应用程序时,我在接受方收到此错误:

GSSException: Failure unspecified at GSS-API level (Mechanism level: Encryption type AES256CTS mode with HMAC SHA1-96 is not supported/enabled)

在我的例子中,错误出现在 GSS 接受方。在我的应用程序中,我以编程方式生成 Jaas 配置(我将此称为 DConfig)并且我不使用配置文件。我发现的第一个解决方案是使用配置文件而不是 DConfig,问题消失了,它运行良好。临时解决方案,Jaas Config 文件:

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

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

我问自己..为什么?

我检查了使用两种配置获取的主题的差异。在工作案例中,使用配置文件,主题在私有(private)凭证中包含密码哈希凭证和主体 TGT 票证。使用 DConfig,我获得了一个只有密码哈希值的主题,但私有(private)凭证中没有主体 TGT 票证。

我的修复

DConfig 包含配置文件的相同设置,其他选项是 Krb5LoginModule 默认值的副本,起初我看不出不当行为的原因。

isInitiator = true 设置到接受方 DConfig 中,解决了这个问题。 `isInitiator = true 已将 TGT 票证强制持久化到主题中。

通过此解决方法,错误消失了,系统 krb5.conf 没有任何变化。

我的意思是...在 Jaas 登录后,让我们检查您的主题私有(private)凭据是否缺少信用(您需要服务主体 TGT 进入您的接受方主题!)并尝试设置 isInitiator = true 也发送到接受方。

问候

关于java - SrcName 为空的 GSSContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34306386/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com