一、LDAP服务器搭建(参考文章http://blog.csdn.net/iceman1952/article/details/37997717)
1、环境准备:
服务器系统:Ubuntu 13-32bit
LDAP服务器:BerkeleyDB http://download.oracle.com/otn/berkeley-db/db-6.1.19.zip
openldap ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.39.tgz
2、安装BerkeleyDB6.1
unzip db-6.1.19.zip
cd db-6.1.19/build_unix/
../dist/configure
sudo make
sudo make install
sudo vim /etc/ld.so.conf
(在最后面加上一行 /usr/local/BerkeleyDB.6.1/lib)
sudo ldconfig -v
BerkeleyDB6.1安装完毕,安装路径:/usr/local/BerkeleyDB.6.1/lib
3.安装openldap-2.4.39
tar xvf openldap-2.4.39.tgz
cd openldap-2.4.39/
sudo ./configure CPPFLAGS="-I/usr/local/BerkeleyDB.6.1/include -D_GNU_SOURCE" LDFLAGS="-L/usr/local/BerkeleyDB.6.1/lib"
sudo make depend
sudo make
sudo make install
openldap-2.4.39 安装完毕,安装路径:/usr/local/etc/openldap
4.测试是否安装成功
(1)简单配置slapd.conf
sudo vim /usr/local/etc/openldap/slapd.conf
修改如下部分为下:
suffix "dc=example,dc=com"
rootdn "cn=Manager,dc=example,dc=com"
(2)启动slapd
su root -c /usr/local/libexec/slapd
(3)建立一个文件example.ldif,内容如下:
dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: Example Company
dc: example
dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager
将文件中的内容插入到LDAP服务器中,然后查询此记录
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f example.ldif
ldapsearch -x -b 'dc=example,dc=com' '(objectclass=*)'
默认密码为secret。
(4)slapd.conf更多配置在生成数字证书后介绍。
二、openssl生成数字证书
(参考文章http://www.ibm.com/developerworks/cn/linux/1312_zhangchao_opensslldap/index.html)
1、openssl安装
我的Ubuntu 13-32bit的虚拟机自带安装了openssl,可通过如下命令查看
openssl version -a
未安装openssl,可自行百度openssl安装教程。
2、生成 SSL/TLS 服务器证书
创建证书分为 3 个步骤,创建 CA、创建证书请求和用 CA 对证书请求签名生成证书。
(1)创建CA
工作目录/usr/lib/ssl/misc,首先进入工作目录
cd /usr/lib/ssl/misc
./CA.sh -newca #生成CA
(2)创建 Server 端证书
证书的生成分为两步,生成证书请求文件和用 CA 对证书文件进行签名。
./CA.pl –newreq #生成证书请求
./CA.pl –sign #CA对证书请求签名
在/usr/lib/ssl/misc 路径下创建了 3 个文件,newreq.pem 创建证书请求文件,newcert.pem CA 签发的证书,newkey.pem 证书对应的钥匙。
重命名证书和私钥文件:
mv newcert.pem server.cert
mv newkey.pem server.key
(3)把这两个文件和 CA 的证书文件拷贝到 OpenLDAP 存放证书的目录下,在/usr/local/etc/openldap/cacerts。
(PS:我的openldap目录下没有cacerts文件夹,自己创建了一个 mkdir cacerts)
# mv server.cert /usr/local/etc/openldap/cacerts
# mv serve.key /usr/local/etc/openldap/cacerts
# cp /usr/lib/ssl/demoCA/cacert.pem /usr/local/etc/openldap/cacerts
3、配置LDAP服务器
编辑/usr/local/etc/openldap/slapd.conf文件
cd /usr/local/etc/openldap/
sudo vim slapd.conf
在文件中加入如下内容:
TLSVerifyClient never # 设置是否验证 client 的身份,其值可以是 never/allow/try/demand,
TLSCACertificateFile /usr/local/etc/openldap/cacerts/cacert.pem #配置 CA 证书的路径
TLSCertificateFile /usr/local/etc/openldap/cacerts/server.cert #配置 server 证书的路径
TLSCertificateKeyFile /usr/local/etc/openldap/cacerts/server.key #配置 server 私钥的路径
#这是各参数的含义
#never 不需要验证 client 端的身份,Client 端只需要有 CA 证书就可以了
#allow Server 会要求 client 提供证书,如果 client 端没有提供证书,会话会正常进行
#try Client 端提供了证书,但是 Server 端有可能不能校验这个证书,这个证书会被忽略,会话正常进行
#demand Server 端需要认证 client 端的身份,Client 端需要有自己的证书和私钥
4、启动ldap服务
同时开启ldap以及ldaps,ldap默认端口389,ldaps端口636
cd /usr/local/libexec #进入slapd目录
sudo ./slapd -d 1 -h "ldaps:/// ldap:///" #开启ldap服务
判断端口389和636是否开启监听
netstat -tnlp |grep 389
netstat -tnlp |grep 636
三、java连接ldap服务器
通过jldap连接,请下载ldap.jar包,我在csdn下载的,亲测可用(http://download.csdn.net/detail/hbedw/3469062)。
也可以使用jndi进行连接,具体可以自行进行实验。
1、普通连接
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPSearchResults;
import com.novell.ldap.util.Base64;
public class LdapTest {
public static void main(String[] args) {
String ldapHost = "192.168.71.129"; //ldap address
String loginDN = "cn=Manager,dc=example,dc=com";
String password = "secret"; //认证密码
int ldapPort = LDAPConnection.DEFAULT_PORT;
LDAPConnection lc = new LDAPConnection();
try {
lc.connect(ldapHost, ldapPort);
lc.bind(LDAPConnection.LDAP_V3, loginDN, password.getBytes("UTF8"));
System.out.println("LDAP connect success!");
} catch (LDAPException e) {
System.out.println("Error: " + e.toString());
} catch (UnsupportedEncodingException e) {
System.out.println("Error: " + e.toString());
} finally {
try {
if (lc.isConnected()) {
lc.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2、通过SSL连接
(1)导出LDAP服务端证书文件
我的ubuntu安装在VMware Workstation 中,使用XShell连接后,将server.cert文件导出到主机
cd /usr/local/etc/openldap/cacerts #进入证书目录
get server.cert #获取证书,导出到默认路径Xshell目录下
(2)将server.cert证书导入java的keystore域中
使用jdk自带的工具keytool导入证书,管理员权限打开cmd,进入keytool所在目录
cd C:\Program Files (x86)\Java\jdk1.7.0_21\bin
导入证书
keytool -import -alias ldapserver -file D:\test\server.cert -keystore cacerts.jks -keypass 123456 -storepass 123456
查看证书是否导入:
keytool -list -keystore cacerts.jks
import java.io.UnsupportedEncodingException;
import java.security.Security;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPJSSESecureSocketFactory;
import com.novell.ldap.LDAPSocketFactory;
public class LdapsTest {
public static void main(String[] args) {
String ldapHost = "192.168.71.131"; //ldap address;
String loginDN = "cn=Manager,dc=example,dc=com";
String password = "secret"; //认证密码
LDAPSocketFactory ssf;
String path = "C:\\Program Files (x86)\\Java\\jdk1.7.0_21\\bin\\cacerts.jks"; //证书所在目录
int ldapPort = 636; //ldaps连接端口
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
System.setProperty("javax.net.ssl.trustStore", path);
ssf = new LDAPJSSESecureSocketFactory();
LDAPConnection.setSocketFactory(ssf);
LDAPConnection lc = new LDAPConnection();
try {
lc.connect(ldapHost, ldapPort);
lc.bind( LDAPConnection.LDAP_V3, loginDN, password.getBytes("UTF8") );
System.out.println( "Successful SSL bind with server.");
} catch (LDAPException e) {
System.out.println("Error: " + e.toString());
} catch (UnsupportedEncodingException e) {
System.out.println("Error: " + e.toString());
} finally {
try {
if (lc.isConnected()) {
lc.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
(PS:对于第二十行代码报错,可参考http://blog.sina.com.cn/s/blog_6714fba70100x6mz.html)
四、总结
本文参考了网上多篇优秀文章,链接均已给出,将环境搭建、代码编写与测试整个过程整合,自己进行了实验,并实现了所需的功能。中间遇到好多小的问题,对于我这个新手来说,还是折腾了不少时间(百度之,艰难解决)。本文主要为解决使用LDAP服务器进行用户认证,对于LDAP服务器的其他功能,比如说查找用户,添加删除用户没有涉及,这些东西可以在网上搜到。当然希望有大牛可以出一个更好的教程,以便新手学习。