一,openldap在linux下的安装
1,编译安装Berkeley DB
tar -zxvf db-4.2.52.tar.gz
cd /usr/local/db-4.2.52.NC/build_unix
../dist/configure
make
make install
2.编译安装openldap
cd openldap-2.1.29
env CPPFLAGS="-I/usr/local/BerkeleyDB.4.2/include" LDFLAGS="-L/usr/local/BerkeleyDB.4.2/lib" ./configure --prefix=/usr/local/openldap -- enable-ldbm
make depens
make
(make test)
make install
3.测试一下
cd /usr/local/openldap/libexec
./slapd -d 1 (屏幕会出现一些信息,最后要是出现slapd start 就成功了,要是没出现这个,呵呵那我也不知道怎么办,再重新编译一下吧.)
cd ../bin
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
要是返回下列信息,那恭喜你,呵呵openldap就安装成功了.
dn:
namingContexts: dc=example,dc=com.
还有很多命令可以用了,推荐一下
二,用PHP操作LDAP服务器
1.建立自己的objectclass.
因为我们证书subject有六项,但是我在默认的几个schema中没有找到包含所有这六项的objectclass,所以还是我们自己创建一个吧.
vi /usr/local/openldap/etc/openldap/schema/inetorgperson.schema
我直接在最后加上下面这段,呵呵,其实也很简单,我就是照着objectclass inetorgperson修改了一下而已,其中的具体意思呵呵OpenLDAP 2.1 管理员指南有解释,不过我也没看懂.
objectclass ( 2.16.840.1.113730.3.2.3
NAME 'guestcertificate'
DESC 'guestcertificate'
SUP top
STRUCTURAL
MAY (
mail $ userCertificate $ cn $ c $ st $ l $ o $ ou )
)
当然也可以新建一个schema文件,把上面的这些包含进去,然后在slapd.conf中再把这个文件包含上就可以了.
2,规划条目结构.
这里主要用到了PHP的几个函数(PHP和APACHE的安装过程http://www.infosecurity.org.cn/forum/read.php?fid=10&tid=34&fpage=1)
$ds=ldap_connect("localhost");
$r=ldap_bind($ds,"cn=root,dc=sage,dc=com","secret");
//
$info["c"]="cn";
$info["objectClass"]="guestcertificate";
$lr=ldap_add($ds, "c=cn,dc=sage,dc=com",$info);
//
$info["c"]="cn";
$info["st"]="gd";
$info["objectClass"]="guestcertificate";
$lr=ldap_add($ds, "st=gd,c=cn,dc=sage,dc=com",$info);
//
$info["c"]="cn";
$info["st"]="gd";
$info["l"]="sz";
$info["objectClass"]="guestcertificate";
$lr=ldap_add($ds, "l=sz,st=gd,c=cn,dc=sage,dc=com",$info);
//
$info["c"]="cn";
$info["st"]="gd";
$info["l"]="sz";
$info["o"]="company";
$info["objectClass"]="guestcertificate";
$lr=ldap_add($ds, "o=company,l=sz,st=gd,c=cn,dc=sage,dc=com",$info);
//
$info["c"]="cn";
$info["st"]="gd";
$info["l"]="sz";
$info["o"]="company";
$info["ou"]="unit";
$info["objectClass"]="guestcertificate";
$lr=ldap_add($ds, "ou=unit,o=company,l=sz,st=gd,c=cn,dc=sage,dc=com",$info);
好了,到这里已经把我的commomname以前的树状结构规划好了.
ldap_connect是与服务器连接,ldap_bind是绑定服务器,第二个参数是在slapd.conf中定义的rootdn,第三个是密码.
ldap_add是增加条目,当然我们这里是第一次增加条目所以每个都要添加,要是以后要添加的话,先用ldap_search查询一下该条目有没有,有了以后就可以不添加了,要是不想做判断也可以,只是会出现Add: Already exists in /wwwroot/add.php on line 7,呵呵不过确实可以工作.
下面来添加用户的证书,证书格式必需是DER格式的,加入是PEM格式的话可以转换一下.
openssl x509 -outform DER -in cert.pem -out cert.der
//
$fp = fopen("/ssl.crt/cert.der", "r");
$cert = fread($fp, 8192);
fclose($fp);
//
$info["c"]="cn";
$info["st"]="gd";
$info["l"]="sz";
$info["o"]="company"
$info["ou"]="unit"
$info["cn"]="commomname";
$info["userCertificate:binary"]="$cert";
$info["objectClass"]="guestcertificate";
$lr=ldap_add($ds, "cn=commomname,ou=unit,o=company,l=sz,st=gd,c=cn,dc=sage,dc=com",$info);
好了一个证书的完整添加过程就完成了,可以用ldap自带的命令ldapsearch查询一下,假如写入了一些证书以后能够发现它们都是层次结构的,查询上一级条目可以列出所有下一级条目.
证书的删除操作:
bool ldap_delete ( resource link_identifier, string dn);
证书的修改操作:
我想证书的修改操作可能也不是修改吧,也就是将老证书删除了,然后按照用户输入的新信息形成新的证书,将新证书写入服务器中.
证书的查询:
用ldap_search查询以后,再$info=ldap_get_entries($ds,$sr);那么证书的c,st,l等就都存在了info数组中.
-----------------------------the end----------------------------------------------------
网上有关PHP操作LDAP存取证书的文章好像不太多,我也是初学,呵呵可能有很多错误,这里有很多是借鉴别人的.也感谢master,文中很多都是他指导我的.
本问题的讨论地址:http://www.infosecurity.org.cn/forum/read.php?fid=12&tid=47&fpage=1