Java 如何使用keytab在LDAP服务器中进行身份验证

Java 如何使用keytab在LDAP服务器中进行身份验证,java,ldap,jndi,kerberos,gssapi,Java,Ldap,Jndi,Kerberos,Gssapi,有没有一种方法可以使用keytab文件而不是直接提供凭据来创建LdapContext?假设我现在有这样一段代码 Hashtable<String,String> env=new Hashtable<String,String>(); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL,LDAP_PROVIDER_U

有没有一种方法可以使用keytab文件而不是直接提供凭据来创建LdapContext?假设我现在有这样一段代码

Hashtable<String,String> env=new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,LDAP_PROVIDER_URL);
env.put(Context.SECURITY_AUTHENTICATION,"simple");
env.put(Context.SECURITY_PRINCIPAL,LDAP_PRINCIPAL);
env.put(Context.SECURITY_CREDENTIALS,LDAP_CREDENTIALS);
LdapContext ctx = new InitialLdapContext(env,null);
Hashtable env=new Hashtable();
put(Context.INITIAL_Context_工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
环境put(Context.PROVIDER\uURL、LDAP\uProvider\uURL);
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY\u主体、LDAP\u主体);
环境put(上下文、安全性、LDAP凭据);
LdapContext ctx=新的初始LdapContext(env,null);

正如您所见,我手动指定用户名和密码。那么,指定keytab文件的正确方法是什么呢?

简而言之,不可能这样做-授权由LDAP完成,而keytab处理身份验证。只能使用基于LDAP的方法创建LdapContext。键表及其作为方法和上下文的调用属于Kerberos协议,而Kerberos协议是一种不同的协议。虽然目前市场上的主要目录服务系统(如Active directory、OpenLDAP、Red Hat IDM)通常同时使用这两种服务,但在使用键表的LdapContext方面,您不能重叠。键表通常用于身份验证方法,而授权方法通常属于LDAP(组或属性)。如果您想使用keytab文件进行基于Java的身份验证,请查看以下内容:

简而言之,不可能这样做-授权由LDAP完成,而keytab处理身份验证。只能使用基于LDAP的方法创建LdapContext。键表及其作为方法和上下文的调用属于Kerberos协议,而Kerberos协议是一种不同的协议。虽然目前市场上的主要目录服务系统(如Active directory、OpenLDAP、Red Hat IDM)通常同时使用这两种服务,但在使用键表的LdapContext方面,您不能重叠。键表通常用于身份验证方法,而授权方法通常属于LDAP(组或属性)。如果您想使用keytab文件进行基于Java的身份验证,请查看以下内容:

是的,您可以这样做,而且效果非常好。看看我的图书馆吧,它会帮你完成所有的艰苦工作:

DirContextSource.Builder builder = new DirContextSource.Builder("ldap://hostname");
builder.gssApiAuth("MyAlternativeEntryName");
DirContextSource contextSource = builder.build();
// try and catch block omitted for the sake of brevity,
// handle NamingException appropriately
DirContext context = contextSource.getDirContext();
// Perform operations
context.close();
确保您配置了一个
login.conf
条目
MyAlternativeEntryName
,该条目如下所示:

MyAlternativeEntryName {
        com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=true
        principal="myprincipal@EXAMPLE.COM"
        useKeyTab=true keyTab="/path/to/krb5.keytab" storeKey=true;
};

是的,你可以这样做,而且效果很好。看看我的图书馆吧,它会帮你完成所有的艰苦工作:

DirContextSource.Builder builder = new DirContextSource.Builder("ldap://hostname");
builder.gssApiAuth("MyAlternativeEntryName");
DirContextSource contextSource = builder.build();
// try and catch block omitted for the sake of brevity,
// handle NamingException appropriately
DirContext context = contextSource.getDirContext();
// Perform operations
context.close();
确保您配置了一个
login.conf
条目
MyAlternativeEntryName
,该条目如下所示:

MyAlternativeEntryName {
        com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=true
        principal="myprincipal@EXAMPLE.COM"
        useKeyTab=true keyTab="/path/to/krb5.keytab" storeKey=true;
};

我会在这个问题中添加kerberos和gssapi标记我会在这个问题中添加kerberos和gssapi标记谢谢,我已经采用了这种方法,它也可以在主题内部手动创建GSSCredential,但是很高兴了解高级way@T-谢谢你,我的工作量太大了,以至于我的大部分辅助活动都很短。谢谢,我已经采用了这种方法,而且在没有手动创建GSSCredential内部主题的情况下,它也很有效,但是很高兴了解高级主题way@T-Heron谢谢,我的工作量太可怕了,我的大部分业余活动都很短。