java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)

一、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

java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)_第1张图片

未安装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服务

这里写图片描述
java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)_第2张图片

判断端口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用法使用请自行百度)
java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)_第3张图片

查看证书是否导入:

keytool -list -keystore cacerts.jks

java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)_第4张图片
(3)java代码

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服务器的其他功能,比如说查找用户,添加删除用户没有涉及,这些东西可以在网上搜到。当然希望有大牛可以出一个更好的教程,以便新手学习。

你可能感兴趣的:(java学习)