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 ciphers ECDH-ECDSA-AES128-GCM-SHA256
- 查看 OpenSSL 是否支持某个协议,如 TLSv1.2
# openssl ciphers TLSv1.2
- 查看 x509 证书
# openssl x509 -in cert.pem -text –noout
- 检测与 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 格式的单个文件
OpenLDAP 的 SSL/TLS 服务器端配置
OpenLDAP 服务端的配置包括软件安装、证书生成、密码组配置等,下面是详细介绍。
- 服务器端需要安装的软件
检查 OpenLDAP 和 OpenSSL 的组件是否已经安装,如果没有,需要先安装如下组件:
- 用 PKI 生成 SSL/TLS 服务器证书
创建证书分为 3 个步骤,创建 CA、创建证书请求和用 CA 对证书请求签名生成证书。
- 创建 CA
/etc/pki/tls/misc 是工作目录,/etc/pki/CA 是存放所有 CA 相关文件的目录。如果脚本检测到/etc/pki/CA 下面有文件存在,CA 脚本什么工作也不会做。为确保 CA 脚本能正常工作,需要先把/etc/pki/CA 目录下的文件全删除。
# cd /etc/pki/tls/misc (进入工作目录) # ./CA –newca (生成 CA)
- 创建 Server 端证书
证书的生成分为两步,生成证书请求文件和用 CA 对证书文件进行签名。
#./CA.pl –newreq (生成证书请求)
- CA 对证书请求签名
#./CA.pl –sign
在/etc/pki/tls/misc 路径下创建了 3 个文件,newreq.pem 创建证书请求文件,newcert.pem CA 签发的证书,newkey.pem 证书对应的钥匙。
# mv newcert.pem server.cert # mv newkey.pem server.key # chmod 644 server.cert # chmod 644 server.key
把这两个文件和 CA 的证书文件拷贝到 OpenLDAP 存放证书的目录下,一般在/etc/openldap/cacerts。如果 CA 与 LDAP server 不在同一台机器上需要用 scp 命令将以下文件拷贝到 LDAP server 相应目录。
# mv server.cert /etc/openldap/cacerts # mv serve.key /etc/openldap/cacerts # cp ../../CA/cacert.pem /etc/openldap/cacerts
- 创建 CA
- 配置 LDAP 服务器
- 停掉 LDAP 服务
#service ldap stop
- 编辑/etc/openldap/slapd.conf 在 slapd.conf 文件中加入以下内容
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem #配置 CA 证书的路径 TLSCertificateFile /etc/openldap/cacerts/server.cert #配置 server 证书的路径 TLSCertificateKeyFile /etc/openldap/cacerts/server.key #配置 server 私钥的路径 TLSCipherSuite ALL:!TLSv1.1:TLSv1.2:!SSLv2:!aNULL:!eNULL:!MD5:!MEDIUM:!LOW :!EXPORT:@STRENGTH #支持的协议密码及不支持的协议和密码,!表示不支持 TLSVerifyClient never # 设置是否验证 client 的身份,其值可以是 never/allow/try/demand, #never 不需要验证 client 端的身份,Client 端只需要有 CA 证书就可以了 #allow Server 会要求 client 提供证书,如果 client 端没有提供证书,会话会正常进行 #try Client 端提供了证书,但是 Server 端有可能不能校验这个证书,这个证书会被忽略,会话正常进行 #demand Server 端需要认证 client 端的身份,Client 端需要有自己的证书和私钥
- 启动 LDAP 服务
OpenLDAP 的 SSL/TLS 客户端配置
OpenLDAP 客户端的配置包括证书创建、服务器连接配置、证书配置、密码组配置等,以下是详细的步骤。
- Client 端的证书文件制作
Client 端的证书制作与 Server 端类似,先创建请求文件,然后用 CA 对请求文件进行签名。签名时一般采用 Client 的主机名(hostname)做为 Common name。证书的名字实际上就是证书中的 Common Name 字段。这个字段应该从证书中进行检索,并根据主机名进行验证,如果二者不能匹配,证书的安全性就会受到质疑。有些公司在不同的主机上使用相同的证书,即使证书中的 Common Name 只是用于一个主机的,这是为了确保证书来自相同的公司,能够进行更深入的检查。Common Name 具体取什么值取决于项目的安全性需要。
#./CA.pl –newreq (生成证书请求) #./CA.pl –sign # mv newcert.pem client.cert # mv newkey.pem client.key # chmod 644 client.cert # chmod 644 client.key
把这两个文件和 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 之间是否能连通
验证 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: oladmin@cn.ibm.com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: top objectClass: posixAccount userPassword: passw0rd uidNumber: 501 gidNumber: 501 homeDirectory: /home/oladmin
# ldapadd -x -D "cn=root,dc=com" -w passw0rd -f /tmp/ldapou.ldif
#service ldap restart
- 配置服务器端并重启服务器端的 LDAP Service
- 配置客户端并重启客户端的 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=com binddn cn=root,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
# ldapsearch -x -ZZ -h 9.181.137.189 636 (ZZ 选项用来启动 TLS 连接)
命令运行后的结果
# extended LDIF # LDAPv3 # base <c=cn,dc=com> (default) with scope subtree # filter: (objectclass=*) # requesting: 636 # cn,ibm.com dn: c=cn,dc=com # People,cn,ibm.com dn: ou=People,dc=com # Group,ibm.com dn: ou=Group,dc=com # oladmin,People,ibm.com dn: uid=oladmin,dc=com ……(此处省略了其他账户的信息)
从返回的结果中可以找到从服务器端导入的 user,如 oladmin 等账户信息,证明 TLS LDAP 连接时建立好了。
回页首
总结
通过本文的讲述和实验,我们可以更深入的了解 OpenLDAP 和 OpenSSL 是如何协同工作的,并如何配置 OpenLDAP 的服务端和客户端以满足用户对数据通信安全的要求,这些都是当前网络安全及加密安全的问题日益严重的情况下,用户的迫切需求。
#openssl s_client –connect vm189.cn.ibm.com:636 –CAfile /etc/openldap/cacerts/cacert .pem-showcerts –state
- Client 端的证书文件制作
- 停掉 LDAP 服务
#service ldap start
- 服务器端需要安装的软件
#openssl pkcs12 -export -in whhit.pem.cer -inkey whhit.pem.key -passin pass:123456 \ -out whhit.p12 -passout pass:123456 -name tomcat