第一章
1.
下载
gcc
下载地址:
rpm found
http://rpmfind.net/linux/rpm2html/search.php?query=gcc&submit=Search+...&system=&arch=
下载:
gcc-4.1.2-12.i386.rpm
这个文件
然后进入
rpm
文件存放的目录下面,使用命令:
rpm –iv
gcc-4.1.2-12.i386.rpm
完成安装。
Rpm
安装软件非常方便。
2.
下载
openssl
http://www.openssl.org/source/openssl-0.9.7e.tar.gz
openssl
解压缩,使用命令:
tar zxvf openssl-0.9.7e.tar.gz
接下来就是
linux
安装三部曲。
进入
openssl
文件存放的目录下面,使用命令
./config
make
make install
安装路径
,
默认
:
/usr/local/
ssl
3.
下载
BerkeleyDB
因为
:由于
openldap
需要用
Berkeley DB
来存放数据,所以要先安装所以需先安装
Berkeley
数据库
.
http://www.oracle.com/technology/products/berkeley-db/index.html
进入
Berkeley
目录解压缩
,
使用命令
:
tar xvzf db-4.5.20.NC.tar.tar
解压缩后生成目录
: db-4.5.20.NC
进入
db-4.5.20.NC/build_unix
目录
,
执行一面的命令
../dist/configure
make
make install
上面是
Linux
源码安装的三部曲。
安装路径
,
默认
:/usr/local/ BerkeleyDB.4.5
。
注意
:
安装完成后要将该软件的库路径
/usr/local/ BerkeleyDB.4.5/lib
加入到
/etc/ld.so.conf
中,然后执行
ldconfig
使配置文件生效
这样在编译
openldap
时候才能找到该库文件。这样数据库安装完了,接下来安装
openldap
。
说明
:ld.so.conf
是系统动态链接库的配置文件,此文件中包含了可被
Linux
共享的动态链接库所在目录的名字(系统目录
/lib,/usr/lib
除外),各个目录之间以空格或者冒号或者逗号隔开。一般的
Linux
发行版中都含有
/usr/X11R6/lib
这个共享库,这是
X Window
窗口系统的动态链接库所在目录。
ldconfig
是他的管理命令。
如果你不按照上面的做法
,
也没有关系
,
只要把
/usr/local/BerkeleyDB.4.5
下面
lib, include
目录下面的所有文件
,
手动拷贝到
/usr/lib
和
/usr/include
目录下面就可以了
.
作用和前面修改配置文件相同
,
目的也是这样在编译
openldap
时候才能找到该库文件
.
使用命令
:
cp /usr/local/ BerkeleyDB.4.5/include/* /usr/include
cp /usr/local/ BerkeleyDB.4.5/lib/* /usr/lib
4.
下载
openldap
ftp://ftp.openldap.org/pub/OpenLDAP/openldap-stable/openldap-stable-20051018.tgz
解压缩
tar zxvf openldap-stable-20051018.tgz
生成目录
openldap-2.3.11
进入
openldap-2.3.11,
使用命令
:
env
CPPFLAGS="-I/usr/local/BerkeleyDB.4.5/include" LDFLAGS="-L/usr/local/BerkeleyDB.4.5/lib"
CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib"
./configure
说明
:
将
BerkeleyDB.4.5
和
ssl
的
lib
和
include
在编译时临时加入到环境变量中
.
一
旦你已运行
configure
脚本,那么
configure
脚本输出的最后一行应当是
Please "make depend" to build dependencies
如果不是上面的这行的话,则说明
configure
脚本失败了,你需要参看它的输出来决定是在什么地方出了点问题。除非
configure
完全成功了,否则你不能进入到下一步。
然后完成三部曲的另外两部
make depend
(
构建依赖关系
)
make
make install
注意
:
安装
ldap
的时候可能遇到的错误
.
错误1.出错信息: configure: error: BDB/HDB: BerkeleyDB not available
错误2. configure: error: BDB/HDB: BerkeleyDB version incompatible
解决方法
:
安装步骤
3
的修改库路径的方法
,
当然你也可以用那个
copy lib
和
include
的方法
.
其他问题
,
解决方案可以自行到
google
上搜索
.
安装路径
,
默认
: /usr/local/etc/openldap
第二章
1 openldap
的
slapd.conf
配置
进入
/usr/local/etc/openldap
目录
,
设定如下
:
defaultaccess read
access to *
by self write
by dn="cn=Manager,dc=wsd-party,dc=sunjapan,dc=com,dc=cn" write
by anonymous read
by * read
…
database bdb
#
默认文件夹
suffix "dc=wsd-party,dc=sunjapan,dc=com,dc=cn"
#
LDAP
管理者用户名
,
密码
rootdn "cn=Manager,dc=wsd-party,dc=sunjapan,dc=com,dc=cn"
rootpw secret
说明
:
dc=wsd-party,dc=sunjapan,dc=com,dc=cn
替换成你自己使用的
ldap
服务器的
domain
地址
.
以后出现
dc=wsd-party,dc=sunjapan,dc=com,dc=cn
,
不再作特殊说明
.
2 openldap
的启动
使用命令
:
/usr/local/libexec/slapd
这样就完成了
ldap
的启动
.
但是这个时候不要高兴,因为还有很多事情要做。
说明
:
推荐一个
ldap
的管理工具
,windows
版本
.
http://www-unix.mcs.anl.gov/~gawor/ldap/
下载安装
,
如何使用
,
不再累赘
,
随便看看就知道了
,
非常简单
.
使用上述工具连接
ldap,
遇到的问题
.
错误
1:
01:30:37
午後
: List failed
Root error: [LDAP: error code 32 - No Such Object]
01:30:40
午後
: Failed to read entry dc=wsd-party,dc=sunjapan,dc=com,dc=cn
Root error: [LDAP: error code 32 - No Such Object]
遇到上面的问题,不要担心,出现这个问题的原因,就是你还没有在这个
ldap
服务中创建初始数据。也就是
no entry
的错误。如何创建导入初期数据,参见第四章。
3 openldap
的关闭
使用命令
:
ps -ef |grep slapd
root 5780 1 0 11:54 ? 00:00:00 /usr/local/libexec/slapd
root 5783 10179 0 11:54 pts/1 00:00:00 grep slapd
然后执行
:
kill
–9
5780
第三章
1 ssl
和
openldap
的连接
OpenSSL
的安全证书的做成
.
http://www.openldap.org/pub/ksoper/OpenLDAP_TLS.html
4.2
CA Issued Certificate
参照
.
步骤
:
A.
创建
CA
创建一个问件夹
myca
进入
myca
这个目录下面
,
然后使用下面的命令来创建一个安全证书
/usr/share/ssl/misc/CA.sh –newca
输入密码
:changeit
再次输入密码
参照下文一个一个输入就可以了
,
主要就是一些个人信息之类的东西
,
和
windows
安装的那套东西差不多
,
随便填填
.
按照上面步骤
,
在
myca
这个文件夹下面产生一个
demoCA
文件夹
其中
,
demoCA/cacert.pem
和
demoCA/private/cakey.pem
就是我们要的东西
.
B.
B
然后我们作成
CSR
参照上面提供的链接
C.
C CA sign the CSR
参照上面提供的链接
D.
把认证好的文件拷贝到
/usr/local/var/openldap-data/
下面
, /usr/local/var/openldap-data/
目录也就是
sldap.conf
的
directory
参数指定的目录
.,
默认情况下无须修改
.
2
OpenLDAP
的
ssl
配置
http://www.openldap.org/pub/ksoper/OpenLDAP_TLS_howto.html
「5.1 Server」
参照
slapd.conf
文件中
TLSVerifyClient
这个选项设置成
never.
具体
slapd
每个字段的具体含义可以参考
5.1
下面的一张表
,
建议仔细阅读
.
Slapd
文件配置可以参考这个说明
html.
能拷过来的尽量拷过来用用。
你也可以参考
http://www.blogjava.net/junky/archive/2007/06/06/122343.aspx
的
[
5.1
配置文件格式
]
这个章节来系统地了解
slapd.conf
文件包含配置信息
3
带
ssl
的
openldad
的启动
使用下面的命令
/usr/local/libexec/slapd -h "ldap:/// ldaps:///"
这个就是带
ssl
的
openldap
的启动。
启动好之后,使用下面命令
ps -ef|grep sladp
你可以看到
root 6871 1 0 10:41 ? 00:00:00 /usr/local/libexec/slapd -h ldap:/// ldaps:///
root 6893 6710 0 13:21 pts/1 00:00:00 grep slapd
说明启动成功。
关闭方法,和不带
ssl
的
openldap
相同。这里不再累赘。
第四章
前面三章都完成之后,接下来我们可以导入
schema
和初期数据了。
1
schema
的导入
将做好的
schema
文件拷贝到
/usr/local/etc/openldap/schema
文件夹中。
说明:什么是
schema
,
schema
有什么作用,参照附录
2
2
导入初期数据
使用你喜欢的编辑器创建一个
LDIF
文件,
LDIF
文件存放
entry
信息。
(
Ldif
的
sample
参考附录
1
)
导入使用命令:
ldapadd -x -D "cn=Manager,dc=wsd-party,dc=sunjapan,dc=com,dc=cn" -W -f [ldif
格式文件的路径
]
你将被提示输入
slapd.conf
中指定的”
secret“
。
注意,导入初期数据的时候,必须确保
openldap
的服务是启动着的。
第五章
要检查服务器是否在运行并且配置是否正确,你可以在服务器上运行
ldapsearch
命令。默认情况下,
ldapsearch
工具的位置是
/usr/local/bin/ldapsearch
。
使用命令
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
上面查询未匿名查询,匿名查询结果:(显然没有任何条目)
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts
#
# search result
search: 2
result: 0 Success
非匿名查询
ldapsearch -x -b '' -D "cn=Manager,dc=zaimuit" -w secret -s base '(objectClass=*)' namingContexts
结果比上面的多出两行
.
dn:
namingContexts: dc=wsd-party,dc=sunjapan,dc=com,dc=cn
还有一种方法,就是从客户端(随便找个
windows
机器就可以了)使用上面提到的
ldapbroser
这个软件查看是否配置并启动成功。
Ssl
启动
ldap
的情况下,如果使用
ldapbroser
连接不上,可能需要配置
ldapbroser
这个软件所使用的
jdk
的
security
属性。
配置方法:
进入到客户端机器的
javahome
目录。
使用第三章做成的
servercrt.pem
和
c:/cacert.pem
A
导入
servercrt.pem
C:/j2sdk1.4.2_06/bin>keytool -import -v -trustcacerts -keystore C:/j2sdk1.4.2_06/jre/lib/security/cacerts -file "c:/servercrt.pem" -alias servercrt
输入密码:
changeit (
第三章做成证书时使用的密码
)
注意:
servercrt
:可以使用别名,这个无所谓。
B
导入
cacert.pem
C:/j2sdk1.4.2_06/bin>keytool -import -v -trustcacerts -keystore
C
:/j2sdk1.4.2_06/jre/lib/security/cacerts -file "c:/cacert.pem " -alias cacert
注意:如果出现下面的错误
keytool error: java.lang.Exception: X.509
证书不存在
解决办法:把上面
pem
文件的
comment
部分删除就可以了。
从“
Certificate
”到“
-----BEGIN CERTIFICATE-----
”上面那一行为止都是
comment
部分,大胆的删除就是了。
第六章
关于实际项目中带
ssl
的
ldap
运用,
tomcat
的配置(
tomcat 4
)
这个配置太复杂,具体一些细节我也不是很清楚。只能在这里先说明作法,至于相关作用和原理,在以后的实践中逐渐领悟。
首先要配置
tomcat
所使用的
jdk
的证书。配置方法,参考第五章的蓝色字体部分。
这个配置的作用暂时也不是很清楚,估计也就是让
apserver
获得
ldap
服务的认证信息。
因为这个
pem
文件是当时通过
SSL
作出来的。
直接参照:
http://tomcat.apache.org/tomcat-4.1-doc/ssl-howto.html
大致步骤:
Sun
在
JDK
中提供了一个安全钥匙与证书的管理工具
Keytool
。
Keytool
把钥匙,证书以及和与它们相关联的证书链储存到一个
keystore
,默任的实现
keystore
的是一个文件,它有一个密码保护存储在其中的内容。
配置一个
SSL/TLS
服务器需要以下几步(在内部网使用时,是否需要这个证书还未确定)
1.
为服务器的
keystore
,以存储证书等。进入到
java
的
bin
目录下面,使用下面的命令
keytool -genkey -alias tomcat -keyalg RSA
在执行上面的命令式,会要求用户输入一些信息,例如
keystore
密码,服务器区域等等,依照提示输入即可。
这样会在
C:/Documents and Settings/luyang.SJNS
下面生成一个
.keystore
的文件。
2.
生成一个
Certificate Signing Request (CSR)
,
CSR
是提供给证书颁发机构,供证书颁发机构依据其中信息生成证书的。
keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr
可能要求输入密码,默认:
changeit
这样会在当前目录下面生成一个
certreq.csr
文件。
3.
将
CSR
提供给证书颁发机构
CA
,等待
CA
颁发证书:
知名的
CA
有
Versign, Thawte
等。
4.
在
CA
等网站上下载
CA
的根证书。
5.
导入
CA
的根证书到
keystore
中
keytool -import -alias root -trustcacerts -file
6.
导入
CA
颁发的证书到
keystore
,
CA
通常不会直接返回一个文件,而是通过网页或
email
以文本形式提供,需要用户自己创建一个文件,再将文本拷入。
keytool -import -alias test.server.net -trustcacerts -file
这样就完成对服务器的配置,最后为服务器指定这个
keystore
就可以了。
附录
1
LDIF
文件
添加初始条目到目录中
你可以用
ldapadd
工具添加条目到你的
LDAP
目录中。
ldapadd
需要
LDIF
格式的输入。我们将通过两步来完成它
:
1.
创建
LDIF
文件
2.
运行
ldapadd
使用你喜欢的编辑器创建一个包含下面内容的
LDIF
文件:
dn: dc=,dc=
objectclass: dcObject
objectclass: organization
o:
dc:
dn: cn=Manager,dc=,dc=
objectclass: organizationalRole
cn: Manager
一定要用你的域名的正确部分取代
和
。
应该用你所在组织的名称来代替。在你剪切和粘贴的时候一定要记得包含前导或者后跟的空格。
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
现在,你可以运行
ldapadd
来把这些条目添加到你目录当中了。
ldapadd -x -D "cn=Manager,dc=,dc=" -W -f example.ldif
一定要用你的域名的正确部分取代
和
。你将被提示输入
slapd.conf
中指定的”
secret“
。比如,对于
example.com
,用:
ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f example.ldif
其中,
example.ldif
是你在上面创建的文件。
附录
2
到底什么是
schema
了。
LDAP
中,
schema
用来指定一个目录中所包含的
objects
的类型(
objectClass
)以及每一个
objectClass
中的各个必备(
mandatory
)和可选(
optional
)的属性(
attribute
)。因此,
Schema
是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的
Entry
下的数据之间的关系。
schema
需要在主配置文件
slapd.conf
中指定,以用来决定本目录中使用到的
objectClass
。管理员可以自己设计制定
schema
,一般包括属性定义(
AttributeDefinition
)、类定义(
ClassDefinition
)以及语法定义(
SyntaxDefinition
)等部分。
LDAP V3
中在
x.500
标准的基础上定义了一个包含了网络中大多常见对象的
schema
,这些对象包括国家、所在地、组织、人员、小组以及设备等。同时,
LDAP V3
中可以很方便的从目录中提取出
schema
,它正是一条记录中关于属性的声明部分。
Schema
中一些参数的说明
1
对象标识符(
Object Identifiers
)
对象标识符(
OID
)是被
LDAP
内部数据库引用的数字标识。
Attribute
的名字是设计为方便人们读取的,但为了方便计算机的处理,通常使用一组数字来标识这些对象,这类同于
SNMP
中的
MIB2
。例如,当计算机接收到
dc
这个
Attribute
时,它会将这个名字转换为对应的
OID
:
1.3.6.1.4.1.1466.115.121.1.26
。
2、objectClass
LDAP
中,一条记录必须包含一个
objectClass
属性,且其需要赋予至少一个值。每一个值将用作一条
LDAP
记录进行数据存储的模板;模板中包含了一条记录中数个必须被赋值的属性和一系列可选的属性。如上述
LDIF
文件中的记录所示,
objectClass
的值为
domain
。
objectClass
有着严格的等级之分,最顶层的类是
top
和
alias
。例如,
organizationalPerson
这个
objectClass
隶属于
Person,
而
Person
又是
top
的子类。
objectClass
大致分为三类:结构型的(如:
person
和
organizationUnit
)、辅助型的(如:
extensibeObject
)和抽象型的(这类不能直接使用)。官方定义的
objectClass,
如下所示:
alias
applicationEntity
dSA
applicationProcess
bootableDevice
certificationAuthority
certificationAuthority-V2
country
cRLDistributionPoint
dcObject
device
dmd
domain
domainNameForm
extensibleObject
groupOfNames
groupOfUniqueNames
ieee802Device
ipHost
ipNetwork
ipProtocol
ipService
locality
dcLocalityNameForm
nisMap
nisNetgroup
nisObject
oncRpc
organization
dcOrganizationNameForm
organizationalRole
organizationalUnit
dcOrganizationalUnitNameForm
person
organizationalPerson
inetOrgPerson
uidOrganizationalPersonNameForm
residentialPerson
posixAccount
posixGroup
shadowAccount
strongAuthenticationUser
uidObject
userSecurityInformation
3 Attribute介绍
如上文所述,
Attribute
类同于编程语言中的变量,它可以被赋值,就像是可以存放一个单一类型信息的容器。官方声明了许多常用的
Attribute,
如果其中没有你所需要的,你可以自己定义,但要避免重名。
objectClass
是一种特殊的
Attribute
,它包含其它用到的
Attribute
以及它自身。常见的
Attribute
如:
givenName
、
l
、
objectClass
、
dc
、
ou
、
cn
、
c
、
mail
、
telephoneNumber
、
sn
、
uid
等。分别介绍如下:
c:
国家;
cn:common name,
指一个对象的名字;如果指人,需要使用其全名;
dc:domain Component,
经常用来指一个域名的一部分,如:
dc=mydomain,dc=org;
givenName
:指一个人的名字,不能用来指姓或者
middle name
;
l:
指一个地名,如一个城市或者其它地理区域的名字;
mail:
电子信箱地址
o:organizationName,
指一个组织的名字
;
objectClass:
一个
LDAP server
要想启用必须能够识别每一个对象的
Attribute
,
objectClass Attribute
正是用来描述一个对象应该具有的
Attribute
及可选
Attribute
。因此,每个
objectClass“
模板”的
Attribute
中必然含有一条
objectClass Attribute
,我不知道用“自包含”称呼这个算不算合适。
ou:organizationalUnitName,
指一个组织单元的名字。
sn:surname,
指一个人的姓
;
telephoneNumber:
电话号码,应该带有所在的国家的代码;
uid:userid,
通常指一个人的登录名,这个不同于
Linux
系统中用户的
uid
;
如果可以这样类比的话,我想,我们不妨把
objectClass
理解为关系数据库的表,而
attribute
则类同为表中的字段。
schema
或许可以类比作一个数据库,但它的这个类比或许从逻辑上说更合适些。