我是LDAP和JNDI的新手。我使用OpenDS设置了一个带SSL的LDAP服务器,并使用JNDI来访问LDAP。
我可以做些什么来确保我真的通过SSL与LDAP服务器进行通信?这是因为当我尝试通过SSL访问LDAP时,我并没有真正看到与客户端有任何区别。
EDITED
我已使用OpenDS设置 LDAP服务器。该目录仅包含1个用户。它的DN是 uid = defaultuser,ou = User,o = IT,dc = QuizPortal 。 LDAP端口= 1389 和 SSL端口= 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上进行通信?
答案 0 :(得分:1)
在服务器端,你可能需要经过身份验证的绑定,然后如果你没有使用SSL,那么你的应用程序就会失败。
您可以对其进行数据包跟踪以查看数据是明文还是加密。
如果您使用的是LDAP over SSL,那么您可能会使用端口636。因此,您可以netstat
查看已连接的端口。
如果您使用的是TLS则更难,因为您使用389,但使用StartTLS它会启动明文,然后转换为使用加密。
在代码中执行此操作吗?不知道。