gpt4 book ai didi

javax.命名.AuthenticationException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:21 38 4
gpt4 key购买 nike

我正在尝试为 ActiveDirectory 创建上下文(客户端和服务器都是 Windows),使用我的 Windows 凭据和 NTLM。

这是我的代码:

public void func() {
try {
URL configURL = getClass().getResource("jaas_ntlm_configuration.txt");
System.setProperty("java.security.auth.login.config", configURL.toString());

// If the application is run on NT rather than Unix, use this name
String loginAppName = "MyConfig";

// Create login context
LoginContext lc = new LoginContext(loginAppName, new SampleCallbackHandler());

// Retrieve the information on the logged-in user
lc.login();

// Get the authenticated subject
Subject subject = lc.getSubject();

System.out.println(subject.toString());

Subject.doAs(subject, new JndiAction(new String[] { "" }));
}
catch (LoginException e) {
e.printStackTrace();
}
}

class JndiAction implements java.security.PrivilegedAction {
private String[] args;

public JndiAction(String[] origArgs) {
this.args = (String[])origArgs.clone();
}

public Object run() {
performJndiOperation(args);
return null;
}

private static void performJndiOperation(String[] args) {

// Set up environment for creating initial context
Hashtable env = new Hashtable(11);

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

// Must use fully qualified hostname
env.put(Context.PROVIDER_URL, "ldap://server:389");

// Request the use of the "GSSAPI" SASL mechanism
// Authenticate by using already established Kerberos credentials
env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI");

try {
/* Create initial context */
// DirContext ctx = new InitialDirContext(env);

// Create the initial context
DirContext ctx = new InitialLdapContext(env, null);


// Close the context when we're done
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}

我的 jaas_ntlm_configuration.txt 文件包含:

MyConfig { com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
doNotPrompt=false;
};

当我尝试启动上下文时,出现以下异常:

javax.naming.AuthenticationException: GSSAPI [Root exception is javax.security.sasl.SaslException: Final handshake failed [Caused by GSSException: Token had invalid integrity check (Mechanism level: Corrupt checksum in Wrap token)]]
at com.sun.jndi.ldap.sasl.LdapSasl.saslBind(Unknown Source)
at com.sun.jndi.ldap.LdapClient.authenticate(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.connect(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.<init>(Unknown Source)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source)
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.init(Unknown Source)
at javax.naming.ldap.InitialLdapContext.<init>(Unknown Source)
at JndiAction.performJndiOperation(JndiAction.java:204)
at JndiAction.run(JndiAction.java:181)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Unknown Source)
at MyTest.Do(MyTest.java:59)
at MyTest.main(MyTest.java:68)
Caused by: javax.security.sasl.SaslException: Final handshake failed [Caused by GSSException: Token had invalid integrity check (Mechanism level: Corrupt checksum in Wrap token)]
at com.sun.security.sasl.gsskerb.GssKrb5Client.doFinalHandshake(Unknown Source)
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(Unknown Source)
... 18 more
Caused by: GSSException: Token had invalid integrity check (Mechanism level: Corrupt checksum in Wrap token)
at sun.security.jgss.krb5.WrapToken_v2.getData(Unknown Source)
at sun.security.jgss.krb5.WrapToken_v2.getData(Unknown Source)
at sun.security.jgss.krb5.Krb5Context.unwrap(Unknown Source)
at sun.security.jgss.GSSContextImpl.unwrap(Unknown Source)
... 20 more

有人可以帮我解决这个问题吗?

最佳答案

您实际上使用的是 Kerberos 身份验证..如果这是你的意思,我可以告诉你我是如何让它工作的:

- add somewhere a file called krb5.conf with inside :

[libdefaults]
default_realm = YOUR_REALM
default_tkt_enctypes = arcfour-hmac-md5
default_tgs_enctypes = arcfour-hmac-md5
permitted_enctypes = arcfour-hmac-md5

dns_lookup_kdc = true
dns_lookup_realm = false

[realms]
YOUR_REALM = {
kdc = KERBEROS_SERVER
default_domain = YOUR_REALM
}
  • 将此行添加到您的代码中:

    System.setProperty("java.security.krb5.conf",PATH_TO_KRB5CONF_FILE);System.setProperty("sun.security.krb5.principal", PRINCIPAL_NAME_WITHOUT_DOMAIN);

如果您不知道您的 Kerberos 服务器,您将无法从命令行启动 klist,并使用使用 LDAP 协议(protocol)的服务(LDAP/server@domain -> server)。

如果还是不行尝试添加

System.setProperty("sun.security.krb5.debug", "true"); 

并发布输出。

关于javax.命名.AuthenticationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025998/

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