4、将这些证书移动到一个指定的地方 # cp demoCA/cacert.pem /usr/local/etc/openldap/ # cp newcert.pem /usr/local/etc/openldap/servercrt.pem # cp newreq.pem /usr/local/etc/openldap/serverkey.pem # chmod 400 /usr/local/etc/openldap/serverkey.pem 最后一条命令是更改serverkey.pem的访问权限,因为它是做为服务器的私有密钥出现,不允许他人访问。 5、修改OpenLDAP服务器配置 # vi /usr/local/etc/openldap/slapd.conf 增加如下内容: TLSCipherSuite HIGH:MEDIUM:+SSLv2 TLSCACertificateFile /usr/local/etc/openldap/cacert.pem TLSCertificateFile /usr/local/etc/openldap/servercrt.pem TLSCertificateKeyFile /usr/local/etc/openldap/serverkey.pem TLSVerifyClient try 注意:对于TLSVerifyClient的各个选项是,如果这里设定为demand,则后面的连接会出现问题,而对于try、allow则没有问题。说不定是OpenLDAP或OpenSSL的bug,我使用的分别是:openssl-0.9.7d_1和openldap-server-2.2.15 # vi /etc/rc.conf 修改相关内容为: slapd_enable="YES" slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldaps://0.0. 0.0/"' slapd_sockets="/var/run/openldap/ldapi" 6、重启OpenLDAP服务器 # /usr/local/etc/rc.d/slapd.sh restart # sockstat -l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS ldap slapd 717 8 stream /var/run/openldap/ldapi ldap slapd 717 9 tcp4 *:389 *:* ldap slapd 717 10 tcp4 *:636 *:* 此时服务器应该就可以使用了。下面是对客户端的配置 (二)客户端的证书 建立客户端证书与建立服务器端的证书过程方法基本一样。再次提醒关于"Common Name",应该根据客户端的情况来填入FQDN。关于客户端的CA证书应该有很多,因为它可能要连接多个LDAP服务器,而每一个服务器都会有一个CA证书。这里就要使用先前建立的那个CA证书。 1、获得LDAP服务端的CA证书。这里直接使用了LDAP的CA证书。 2、生成客户端的CSR,得到newreq.pem 提示:这里对“Common Name”的要求不是那么,即不一定是客端的名字 # openssl req -newkey rsa:1024 -nodes -keyout newreq.pem -out newreq.pem 3、使用服务端的CA证书签署刚才的CSR,得到newcrt.pem # /usr/local/openssl/misc/CA.sh -sign 4、复制newreq.pem和newcrt.pem到一个指定的地方 # cp newcert.pem /usr/local/etc/openldap/client.cert.pem # cp newreq.pem /usr/local/etc/openldap/client.key.pem # chmod 400 /usr/local/etc/openldap/client.key.pem client.key.pem为客户端的私钥,所以要更读取权限。 5、修改客户端的配置 # vi /usr/local/etc/openldap/ldap.conf 修改相关内容为: HOST localhost PORT 636 TLS_CACERT /usr/local/etc/openldap/cacert.pem TLS_REQCERT demand 注意:ldap.conf是用于设定客户端全局变量用的。选项TLS_REQCERT默认为demand,即要求验证服务端,如果在连接LDAP服务器时出现了什么错误,很大可能就是TLS_CACERT所指定的CA证书不对。在这里它直接指向服务端所使用的CA证书。 实际上,在这个时候就已经可以进行SSL的连接了,如果服务端的TLSVerifyClient选项不是设定为demand或hard的话。如果是设定为demand,则在客户端还要进行下面的配置。 针对特定的登录用户进行设定,利用.ldaprc文件加载公钥和私钥: # vi ~/.ldaprc 类似TLS_CERT和TLS_KEY等user-only类型的选项,只能用于此文件中。 TLS_CERT /usr/local/etc/openldap/client.cert.pem TLS_KEY /usr/local/etc/openldap/client.key.pem 注意:.ldaprc使用户可以根据自己的需要来设定选项的值,如果设定了全局选项的值,则它会自动重载ldap.conf里的相应选项。 (三)查询测试 1、使用openssl连接测试 注意:TLSVerifyClient选项若不为demand,则使用 # openssl s_client -connect localhost:636 -showcerts -state -CAfile /usr/local/etc/openldap/cacert.pem 若为demand,则使用 # openssl s_client -connect myserver.com:636 -state -CAfile /usr/local/etc/openldap/cacert.pem -cert /usr/local/etc/openldap/client.cert.pem -key /usr/local/etc/openldap/client.key.pem 下面的结果是第一种情况的输出。 CONNECTED(00000003) SSL_connect:before/connect initialization SSL_connect:SSLv2/v3 write client hello A SSL_connect:SSLv3 read server hello A depth=1 /C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=abc.cn verify return:1 depth=0 /C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=myth.unix.cn verify return:1 SSL_connect:SSLv3 read server certificate A SSL_connect:SSLv3 read server certificate request A SSL_connect:SSLv3 read server done A SSL_connect:SSLv3 write client certificate A SSL_connect:SSLv3 write client key exchange A SSL_connect:SSLv3 write change cipher spec A SSL_connect:SSLv3 write finished A SSL_connect:SSLv3 flush data SSL_connect:SSLv3 read finished A --- Certificate chain 0 s:/C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=myth.unix.cn i:/C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=abc.cn -----BEGIN CERTIFICATE----- MIIDBDCCAm2gAwIBAgIBATANBgkqhkiG9w0BAQQFADBWMQswCQYDVQQGEwJDTjET ...... i4u6d3MxWEE= -----END CERTIFICATE----- 1 s:/C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=abc.cn i:/C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=abc.cn -----BEGIN CERTIFICATE----- MIIC0zCCAjygAwIBAgIBADANBgkqhkiG9w0BAQQFADBWMQswCQYDVQQGEwJDTjET ..... X9KQMC6DWw== -----END CERTIFICATE----- --- Server certificate subject=/C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=myth.unix.cn issuer=/C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=abc.cn --- Acceptable client certificate CA names /C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=abc.cn --- SSL handshake has read 1767 bytes and written 352 bytes --- New, TLSv1/SSLv3, Cipher is AES256-SHA Server public key is 1024 bit SSL-Session: Protocol : TLSv1 Cipher : AES256-SHA Session-ID: 74F46023120F479F44AE52D3C5E9EC45315CDB301F22A94498256862FF6BE0A1 Session-ID-ctx: Master-Key: F419DE4C85D016B678AB535084A485B5794FF5E9E3170FD081A95167F59A4684 Key-Arg : None Start Time: 1100800508 Timeout : 300 (sec) Verify return code: 0 (ok) --- ^C 许多人在粗体字那个地方出错,常见的错误我也是遇到的,主要就是TLSVerifyClient设置为了demand。 2、使用ldapsearch测试 # ldapsearch -x -b 'dc=example,dc=com' -D 'cn=zxp,dc=example,dc=com' -w secret -H ldaps://localhost/ '(objectclass=*)' -ZZ 对于OpenLDAP 2.2 来说"-ZZ"好象已不太重要。 # ldapsearch -x -b 'dc=example,dc=com' -D 'uid=abc,ou=People,dc=example,dc=com' -w abcabc -H ldaps://localhost/ '(objectclass=*)' 搜索到条目若干,成功! 总结 实际上,OpenLDAP也支持中文,甚至连象uid这样的标识的值都可以为中文,其它属性的值当然也可以为中文了。不过直接导入中文是不行的,必须将中文编码为utf-8这一类的字符集。经过实践,只认识到这么多的内容。感兴趣的朋友可以一起讨论。 |