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 的组件是否已经安装,如果没有,需要先安装如下组件:

      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 对证书请求签名生成证书。

      1. 创建 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)
      2. 创建 Server 端证书

        证书的生成分为两步,生成证书请求文件和用 CA 对证书文件进行签名。

        #./CA.pl –newreq      (生成证书请求)
      3. 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
    • 配置 LDAP 服务器
      1. 停掉 LDAP 服务
        #service ldap stop
      2. 编辑/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 端需要有自己的证书和私钥
      3. 启动 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

            运行如下命令增加用户和组到 LDAP 服务器目录

            # ldapadd -x -D "cn=root,c=cn,dc=ibm,dc=com" -w passw0rd -f /tmp/ldapou.ldif

            重启 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

             # ldapsearch -x -ZZ -h 9.181.137.189 636 (ZZ 选项用来启动 TLS 连接)

            命令运行后的结果

            # extended LDIF
            # LDAPv3
            # base <c=cn,dc=ibm,dc=com> (default) with scope subtree
            # filter: (objectclass=*)
            # requesting: 636
            # cn, ibm.com
            dn: c=cn,dc=ibm,dc=com
            # People, cn, ibm.com
            dn: ou=People,c=cn,dc=ibm,dc=com
            # Group, cn, ibm.com
            dn: ou=Group,c=cn,dc=ibm,dc=com
            # oladmin, People, cn, ibm.com
            dn: uid=oladmin,ou=People,c=cn,dc=ibm,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
        #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
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐