天天看点

艰难安装LDAP,SSL认证

第一章

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 <filename_of_the_root_certificate>

6. 导入 CA 颁发的证书到 keystore , CA 通常不会直接返回一个文件,而是通过网页或 email 以文本形式提供,需要用户自己创建一个文件,再将文本拷入。

keytool -import -alias test.server.net -trustcacerts -file <your_certificate_filename>

这样就完成对服务器的配置,最后为服务器指定这个 keystore 就可以了。        附录 1  LDIF 文件 添加初始条目到目录中

你可以用 ldapadd 工具添加条目到你的 LDAP 目录中。 ldapadd 需要 LDIF 格式的输入。我们将通过两步来完成它 :

1. 创建 LDIF 文件

2. 运行 ldapadd

使用你喜欢的编辑器创建一个包含下面内容的 LDIF 文件:

dn: dc=<MY-DOMAIN>,dc=<COM>

objectclass: dcObject

objectclass: organization

o: <MY ORGANIZATION>

dc: <MY-DOMAIN>

dn: cn=Manager,dc=<MY-DOMAIN>,dc=<COM>

objectclass: organizationalRole

cn: Manager

一定要用你的域名的正确部分取代 <MY-DOMAIN> 和 <COM> 。 <MY ORGANIZATION> 应该用你所在组织的名称来代替。在你剪切和粘贴的时候一定要记得包含前导或者后跟的空格。

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=<MY-DOMAIN>,dc=<COM>" -W -f example.ldif

一定要用你的域名的正确部分取代 <MY-DOMAIN> 和 <COM> 。你将被提示输入 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 或许可以类比作一个数据库,但它的这个类比或许从逻辑上说更合适些。