gpt4 book ai didi

java - 如何确保来自 JNDI 的 LDAP 连接通过 SSL

转载 作者:行者123 更新时间:2023-11-30 11:57:57 25 4
gpt4 key购买 nike

我是 LDAP 和 JNDI 的新手。我已经使用 OpenDS 设置了一个带 SSL 的 LDAP 服务器和一个使用 JNDI 访问 LDAP 的客户端。

如何确保我真正通过 SSL 与 LDAP 服务器通信?这是因为当我尝试通过 SSL 和不通过 SSL 访问 LDAP 时,我从客户端看不出有任何区别。

已编辑

我已经使用 OpenDS 设置了 LDAP 服务器。该目录仅包含 1 个用户。它的 DN 是 uid=defaultuser,ou=User,o=IT,dc=QuizPortalLDAP 端口 = 1389SSL 端口 = 1636。默认端口 389 和 636 当前被一些其他程序使用。我还选择了生成自签名证书 选项。

下面是来自客户端的代码。它基本上对用户的属性进行简单查询。

public static void main(String[] args)
{
String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
String MY_HOST = "ldap://KhooGP-Comp3:1389";
String MGR_DN = "cn=Directory Manager";
String MGR_PW = "password";
String MY_SEARCHBASE = "ou=User,o=IT,dc=QuizPortal";
String MY_FILTER = "uid=defaultuser";
String MY_ATTRS[] = {"cn", "telephoneNumber", "userPassword"};

//Identify service provider to use
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
env.put(Context.PROVIDER_URL, MY_HOST);

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, MGR_DN);
env.put(Context.SECURITY_CREDENTIALS, MGR_PW);

try
{
// Create the initial directory context
InitialDirContext initialContext = new InitialDirContext(env);
DirContext ctx = (DirContext)initialContext;

System.out.println("Context Sucessfully Initialized");

SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

NamingEnumeration results = ctx.search(MY_SEARCHBASE, MY_FILTER, constraints);

while(results != null && results.hasMore())
{
SearchResult sr = (SearchResult) results.next();
String dn = sr.getName() + "," + MY_SEARCHBASE;
System.out.println("Distinguished Name is " + dn);

Attributes ar = ctx.getAttributes(dn, MY_ATTRS);

if(ar == null)
{
System.out.println("Entry " + dn);
System.out.println(" has none of the specified attributes\n");
}
else
{
for(int i=0; i<MY_ATTRS.length; i++)
{
Attribute attr = ar.get(MY_ATTRS[i]);
System.out.println(MY_ATTRS[i] + ":");

for(Enumeration vals=attr.getAll(); vals.hasMoreElements();)
{
System.out.println("\t" + vals.nextElement());
}
}
}
}
}
catch(Exception e)
{
System.err.println(e);
}
}

我也按照建议做了 netstat,并且在端口 1636 上有一个通信。那么这是否意味着我真的已经在 SSL 上通信了?

最佳答案

在服务器端,您可能需要经过身份验证的绑定(bind),然后如果您不执行 SSL,那么您的应用程序将失败。

您可以对其进行数据包跟踪以查看数据是明文还是加密。

如果您在 SSL 上使用 LDAP,那么您很可能正在使用端口 636。所以你可以 netstat 查看你连接的端口。

如果您使用的是 TLS,那就更难了,因为您使用的是 389,但是使用 StartTLS,它会开始使用明文,然后转换为使用加密。

用代码做?不知道。

关于java - 如何确保来自 JNDI 的 LDAP 连接通过 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3466258/

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