OpenLDAP 和 OpenSSL 简介
OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索、身份认证、安全通道、过滤器等等。大多数的 Linux 发行版里面都带有 OpenLDAP 的安装包。OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端。由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性。OpenLDAP 是使用 OpenSSL 来实现 SSL/TLS 加密通信的。
OpenSSL 是 SSL/TLS 加密算法及通信协议的开源实现包,实现了 SSLv2、SSLv3、TLSv1 及 TLSv1.2 的加密算法和通信协议,并提供 API 给第三方应用。第三方应用可以很容易的使用 OpenSSL 来将明文通信加密。OpenLDAP 和 OpenSSL 的互相配合是本文的主要内容,包括:OpenLDAP 服务端的 SSL/TLS 配置、OpenLDAP 客户端的 SSL/TLS 配置。
本文讲述的所有内容和命令适用于 Redhat Enterprise Linux 6.3,其他发行版本的 Linux 可能略有不同。
回页首
配置 OpenLDAP 使用 SSL/TLS 加密数据通信
SSL/TLS 加密原理简介
SSL/TLS 是基于 PKI 机制的加密方式,包括证书认证、密钥交换、非对称加密、对称加密。SSL/TLS 采用 CA 作为服务端和客户端都信赖的具有权威性的组织,证书的颁发和认证都依赖于 CA,并假定 CA 颁发的证书是可靠的、可信赖的,证书里面的内容是真实的、有效的,并可用于客户机和服务器进行安全的可靠的通信加密。
SSL/TLS 证书用来认证服务器和客户机双方的身份,并用于密钥交换时候的非对称加密。密钥交换完毕之后,就可以用这个密钥做通信数据的对称加密了,具体的加密算法是由客户机和服务器互相协商得来。服务器和客户机由于 SSL/TLS 库的不同以及用户的配置不同,双方支持的算法列表不完全相同,当双方做 SSL/TLS 握手的时候,就需要将自己支持的算法列表及优先顺序告知对方,一旦对方按照优先顺序找到了第一个支持的算法,那么协商完成,否则双方协商失败,SSL/TLS 连接断开。
如何配置 OpenLDAP 客户端和服务端的算法列表将在本文的后续内容中做重点介绍,用户可以通过控制这个列表来提高安全等级,或者降低安全等级来适应更多的算法。
OpenSSL 常用命令
OpenSSL 提供了为数众多的命令来帮助用户使用和查看 SSL/TLS 加密算法、查看证书、生成证书、测试 SSL/TLS 连接等等,以下是一些常用命令的介绍。
• 查看 OpenSSL 支持的所有算法
#openssl ciphers
• 查看 OpenSSL 是否支持某个算法,如 ECDH-ECDSA-AES128-GCM-SHA256
• 查看 OpenSSL 是否支持某个协议,如 TLSv1.2
• 查看 x509 证书
• 检测与 LDAP server 的连接
• # openssl s_client -connect 9.181.137.155:636 -showcerts -state
-CAfile /opt/ibm/director/vmi/data/sec/vmitruststore.pem
• 生成自签名的 CA 证书
• #openssl req -x509 -newkey rsa:1024 -passout pass:123456 -days 3650
• -keyout whhit.pem.key -out whhit.pem.cer -subj
“/CN=whhit.me/OU=WeRun Club/O=whhit/L=Weihai/S=Shandong/C=CN”
• 生成私钥
#openssl genrsa -des3 -out whhit.pem.key -passout pass:123456 1024
• 使用指定的私钥生成一个 CSR (Certificate Signing Request)
• #openssl req -new -key whhit.pem.key -passin pass:123456
• -out whhit.pem.csr -subj
“/CN=whhit.me/OU=WeRun Club/O=whhit/L=Weihai/S=Shandong/C=CN”
• 将加密的私钥导出为明文的私钥
#openssl rsa -in whhit.pem.key -passin pass:123456 -out whhit.pem.clear.key
• 使用指定的私钥签名生成证书
#openssl x509 -req -days 3650 -in whhit.pem.csr -signkey whhit.pem.clear.key -out whhit.pem.cer
• 将私钥和证书转化为 PKCS#12 格式的单个文件
• #openssl pkcs12 -export -in whhit.pem.cer -inkey whhit.pem.key -passin pass:123456
-out whhit.p12 -passout pass:123456 -name tomcat
OpenLDAP 的 SSL/TLS 服务器端配置
OpenLDAP 服务端的配置包括软件安装、证书生成、密码组配置等,下面是详细介绍。
• 服务器端需要安装的软件
检查 OpenLDAP 和 OpenSSL 的组件是否已经安装,如果没有,需要先安装如下组件:
openldap2-back-meta-2.4.20-35,openldap2-client-2.4.20-35,openldap2-2.4.20-35,
openldap2-back-perl-2.4.20-35,openssl-1.0.1e-13,openssl-32bit-1.0.1e-13,
php5-openssl-5.2.14-0.7.30.38.2,python-openssl-0.7.0-217
• 用 PKI 生成 SSL/TLS 服务器证书
创建证书分为 3 个步骤,创建 CA、创建证书请求和用 CA 对证书请求签名生成证书。
把这两个文件和 CA 的证书文件拷贝到 OpenLDAP 存放证书的目录下,一般在/etc/openldap/cacerts。如果 CA 与 LDAP server 不在同一台机器上需要用 scp 命令将以下文件拷贝到 LDAP server 相应目录。
• 配置 LDAP 服务器
把这两个文件和 CA 的证书文件用 scp 命令拷贝到 Client 端 OpenLDAP 存放证书的目录下,如/etc/openldap/cacerts。
• 编辑/etc/openldap/ldap.conf
• URI ldaps://vm189.cn.ibm.com:636 # 一定要和 server 的证书里输入的 full qualified name 一样
• TLS_CACERT /etc/openldap/cacerts/cacert.pem # CA 的证书
• TLS_REQCERT never # client 是否要求认证 server 端
• TLS_CIPHER_SUITE ALL:!TLSv1.1:!TLSv1:!SSLv3:!SSLv2:!aNULL:!eNULL:!MD5:!MEDIUM:!LOW:
!EXPORT:@STRENGTH
• 重启 LDAP 服务
#service ldap restart
• 检验与 LDAP server 之间是否能连通
• #openssl s_client –connect vm189.cn.ibm.com:636 –CAfile /etc/openldap/cacerts/cacert
.pem-showcerts –state
验证 OpenLDAP 服务器端和客户端的 SSL/TLS 协议协商方式
为了验证 OpenLDAP 的服务端和客户端的 SSL/TLS 连接协议的正确性,我们可以按照如下的步骤来检验。
• 配置服务器端并重启服务器端的 LDAP Service
按照前面叙述的步骤配置好 LDAP 服务器。
重启 LDAP Service
#service ldap restart
导入 LDAP user 信息
将 ldif 文件上传到 ldap 服务器,如 tmp 目录。如导入的文件名字为 ldapou.ldif, 其文件中关于 oladmin 账户的内容如下:
dn: uid=oladmin,ou=People,c=cn,dc=ibm,dc=com
uid: oladmin
cn: oladmin
sn: oladmin
mail: [email protected]
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: top
objectClass: posixAccount
userPassword: passw0rd
uidNumber: 501
gidNumber: 501
homeDirectory: /home/oladmin
运行如下命令增加用户和组到 LDAP 服务器目录
重启 LDAP Service
#service ldap restart
• 配置客户端并重启客户端的 LDAP Service
在客户端的/etc/openldap/目录中配置 ldap.conf 文件,内容如下:
TLS_REQCERT never
TLS_CIPHER_SUITE ALL:!TLSv1.1:!TLSv1:!SSLv3:!SSLv2:!aNULL:!eNULL:!MD5:!MEDIUM
:!LOW:!EXPORT:@STRENGTH
URI ldaps://vm189.cn.ibm.com:636 #ldap server 地址
base c=cn,dc=ibm,dc=com
binddn cn=root,c=cn,dc=ibm,dc=com
bindpw crypt{77f132b2f9d77723}
searchfilter (&(uid=%v)(objectclass=inetOrgPerson))
pam_login_attribute uid
ldap_version 3
timelimit 30
bind_timelimit 30
bindpw_key /etc/openldap/fsm.data #密码
TLS_CACERT /opt/ibm/director/vmi/data/sec/vmitruststore.pem #CA 证书
pam_lookup_policy yes
• 在客户端验证服务器端的 LDAP user 信息
运行 ldapsearch 命令,查看服务器端的 user
命令运行后的结果
dn: c=cn,dc=ibm,dc=com
dn: ou=People,c=cn,dc=ibm,dc=com
dn: ou=Group,c=cn,dc=ibm,dc=com
dn: uid=oladmin,ou=People,c=cn,dc=ibm,dc=com
……(此处省略了其他账户的信息)
从返回的结果中可以找到从服务器端导入的 user,如 oladmin 等账户信息,证明 TLS LDAP 连接时建立好了。
以上是第三方证书。如果是自签名证书按以下配置来:
1.为啥要用TLS?
Openldap默认使用简单验证,对slapd的所有访问都使用明文密码通过未加密通道进行。为了确保信息安全,需要对信息进行加密传输,SSL(Secure Sockets Layer)是一个可靠的解决方案。
它使用 X.509 证书,由可信任第三方(Certificate Authority (CA))进行数字签名的一个标准格式的数据。有效的数字签名意味着已签名的数据没有被篡改。如果签名的数据被更改,将不会通过验证
SSL/TLS 加密原理简介
SSL/TLS 是基于 PKI 机制的加密方式,包括证书认证、密钥交换、非对称加密、对称加密。SSL/TLS 采用 CA 作为服务端和客户端都信赖的具有权威性的组织,证书的颁发和认证都依赖于 CA,并假定 CA 颁发的证书是可靠的、可信赖的,证书里面的内容是真实的、有效的,并可用于客户机和服务器进行安全的可靠的通信加密。
SSL/TLS 证书用来认证服务器和客户机双方的身份,并用于密钥交换时候的非对称加密。密钥交换完毕之后,就可以用这个密钥做通信数据的对称加密了,具体的加密算法是由客户机和服务器互相协商得来。服务器和客户机由于 SSL/TLS 库的不同以及用户的配置不同,双方支持的算法列表不完全相同,当双方做 SSL/TLS 握手的时候,就需要将自己支持的算法列表及优先顺序告知对方,一旦对方按照优先顺序找到了第一个支持的算法,那么协商完成,否则双方协商失败,SSL/TLS 连接断开。
环境说明:
主机名 角色 IP地址
Liutao openldap server 192.168.1.150
Xmb250 openldap client + CA 192.168.1.250
准备工作:
改为: certificate = $dir/CA.crt # The CA certificate
改为:private_key = $dir/private/CA.key # The private key
改为: countryName_default = CN
< #stateOrProvinceName_default = Default Province
改为: stateOrProvinceName_default = Shaanxi
< localityName_default = Default City
改为:localityName_default = Xian
< 0.organizationName_default = Default Company Ltd
改为:0.organizationName_default = GDS
< #organizationalUnitName_default =
Country Name (2 letter code) [CN]: CN
State or Province Name (full name) [Shaanxi]:
Locality Name (eg, city) [Xian]:
Organization Name (eg, company) [GDS]:
Organizational Unit Name (eg, section) [OPM]:
Common Name (eg, your name or your server’s hostname) []:xmb250
Email Address []:可以直接回车
二、openldap server生成私钥及证书请求文件
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xian
Organization Name (eg, company) [Default Company Ltd]:GDS
Organizational Unit Name (eg, section) []:OPM
Common Name liutao (这里写1.150主机名)
Email Address []: 可以不写直接回车
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:123456
三、CA服务器向openldap server签发证书
1)1.150向 1.250请求证书
在1.150上执行:
[root@ldapsrv02 ~]# scp ldapsrv02.csr [email protected]:/root
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.49.136’ (RSA) to the list of known hosts.
[email protected]’s password:
ldapsrv02.csr 100% 777 0.8KB/s 00:00
2)CA服务器颁发证书
在1.125上执行:
[root@ldapclient CA]# openssl ca -in /root/ldapsrv02.csr -out /root/ldapsrv02.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Sep 18 08:22:46 2016 GMT
Not After : Sep 18 08:22:46 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = Shaanxi
organizationName = Xian
organizationalUnitName =OPM
commonName = xmb250
emailAddress
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
39:FB:0E:BD:7D:03:7E:F3:9E:C3:BE:5B:4D:45:8B:63:B7:8B:7F:26
X509v3 Authority Key Identifier:
keyid:08:FF:94:52:EC:BD:97:12:5B:96:DD:1E:36:08:43:FF:AD:2F:7B:C8
Certificate is to be certified until Sep 18 08:22:46 2017 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
四、openldap server下载并安装证书
1)1.150服务器端下载证书
在1.250上执行:
[root@ldapclient CA]# scp /root/ldapsrv02.crt [email protected]:/root
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.1.150’ (RSA) to the list of known hosts.
[email protected]’s password:
ldapsrv02.crt 100% 3271 3.2KB/s 00:00
[root@ldapclient CA]# scp CA.crt 192.168.1.150:/etc/openldap/certs/
The authenticity of host 'ldapsrv02 (192.168.1.150)
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘ldapsrv02’ (RSA) to the list of known hosts.
root@ldapsrv02’s password:
CA.crt 100% 1078 1.1KB/s 00:00
2)1.150服务器端安装证书
cd /root/
mv ldapsrv02.crt /etc/openldap/certs/
mv /etc/pki/CA/ldapsrv02.key /etc/openldap/certs/ (注意ldapsrv02.key路径不一定是这里)
vi /etc/openldap/ldap.conf #编辑ldap.conf文件
修改以下内容:
URI ldap://liutao 注:服务器计算机名
BASE dc=gds,dc=com
TLS_CACERTDIR /etc/openldap/certs
[root@ldapsrv02 ~]# vi /etc/openldap/slapd.conf
修改以下内容:
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile /etc/openldap/certs/ldapsrv02.crt
TLSCertificateKeyFile /etc/openldap/certs/ldapsrv02.key
[root@ldapsrv02 ~]# service slapd stop #关闭slapd服务
Stopping slapd: [ OK ]
[root@ldapsrv02 ~]# slapd -h “ldap://192.168.1.150/ ldaps://192.168.1.150/” #重启slapd服务,这里同时监听加密和不加密端口
[root@ldapsrv02 ~]# netstat -tunlp|grep slapd #查看slapd监听的端口
tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN 1757/slapd
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1757/slapd
tcp 0 0 :::636 ::? LISTEN 1757/slapd
tcp 0 0 :::389 ::? LISTEN 1757/slapd
五、ldapclient客户端测试
1)下载CA公钥
在1.250上执行:
cp /etc/pki/CA/private/CA.key /etc/openldap/certs/
说明:因为我的CA证书中心也同时作为ldap客户端,所以这里只需要拷贝到对应目录即可,如果CA证书中心和ldap客户端不在同一台服务器上,需要使用scp或者rz等其他方式拷贝到ldap客户端上。
2)修改ldap客户端配置
cp /etc/openldap/ldap.conf /etc/openldap/ldap.conf.bak$(date +%F)
[root@ldapclient CA]# vi /etc/openldap/ldap.conf
TLS_REQCERT allow
TLS_CACERTDIR /etc/openldap/certs
BASE dc=gds,dc=com
URI ldaps://liutao/
[root@ldapclient CA]# ldapwhoami -v -x -Z
ldap_initialize( )
ldap_start_tls: Can’t contact LDAP server (-1)
additional info: TLS error -8172:Peer’s certificate issuer has been marked as not trusted by the user.
ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)
上述错误的解决方法是:
编辑/etc/openldap/ldap.conf,添加““TLS_REQCERT allow”。
[root@ldapclient CA]# ldapwhoami -v -x -Z
ldap_initialize( )
ldap_start_tls: Operations error (1)
additional info: TLS already started
anonymous
Result: Success (0)
[root@ldapclient CA]# ldapsearch -x -D “cn=admin,dc=gds,dc=com” -H ldaps://192.168.1.150 -W -b “dc=gds,dc=com”
Enter LDAP Password: 默认是:secret
search: 2
result: 32 No such object
#因为ldapsrv02仅仅是安装了openldap,并没有导入数据,所以这里的查询结果是正确的。
1.Server制作自签名证书
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name(eg, your name or your server’s hostname)[]:master.example.com //主机名用FQDN格式
Email Address []:[email protected]
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
将生成的ldap.csr文件发送到CA进行签名。如果发送此文件到CA进行签名,则需要确保提供的所有信息拼写正确。这里不使用ca中心对csr进行签名。
完成自签名证书的制作,ldap.key(私钥)、ldap.crt(证书、公钥)。
2.修改目录权限及所有者
3.修改配置文件,添加证书路径
TLS_CACERTDIR /etc/openldap/certs //更改证书目录
TLS_REQCERT allow //允许自签名证书(服务器、客户机都加入)
TLSCertificateFile /etc/openldap/certs/ldap.crt
TLSCertificateKeyFile /etc/openldap/certs/ldap.key
4.重新生成配置文件 并启动服务
5.客户端配置及测试
先利用setup工具配置,在# vim /etc/openldap/ldap.conf添加
TLS_REQCERT allow //允许自签名证书(服务器、客户机都加入)
TLS_CACERTDIR /etc/openldap/cacerts
URI ldaps://192.168.0.254
BASE dc=example,dc=com
客户端测试
1.# ldapwhoami -v -x -Z //匿名测试ssl链接
ldap_initialize( )
ldap_start_tls: Operations error (1)
additional info: TLS already started
anonymous
Result: Success (0)
2.ldaps验证用户密码
#ldapwhoami -D “uid=ldapuser1,ou=People,dc=example,dc=com” -W -H ldaps://192.168.0.254 -v
ldap_initialize( ldaps://192.168.0.254:636/??base )
Enter LDAP Password:
dn:uid=ldapuser1,ou=People,dc=example,dc=com
Result: Success (0)
-D 指定distinguish name
-W提示输入密码
-H 使用ldap://或ldaps://协议
-h IP
-v详细信息
3.搜索ldap服务器域信息