说服openldap在cn = config的Ubuntu上使用SSL

我根本无法得到这个(TLS连接到openldap)工作,并希望得到一些帮助。

我有一个工作在Ubuntu 10.04 LTS的OpenLDAP服务器,它被configuration为使用cn = config,我可以findTLS的大部分信息似乎使用旧的slapd.conf文件:-(

我一直在这里https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html加上我在这里和其他地方读过的指令,这当然可能是问题的一部分我不完全理解这一切呢!

我创build了一个ssl.ldif文件,如下所示:

dn:cn=config add: olcTLSCipherSuite olcTLSCipherSuite: TLSV1+RSA:!NULL add: olcTLSCRLCheck olcTLSCRLCheck: none add: olcTLSVerifyClient olcTLSVerifyClient: never add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ssl/certs/ldap_cacert.pem add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/my.domain.com_slapd_cert.pem add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/my.domain.com_slapd_key.pem 

我使用下面的命令行导入它

 ldapmodify -x -D cn=admin,dc=mydomain,dc=com -W -f ssl.ldif 

我编辑了/ etc / default / slapd,以便它具有以下服务行;

 SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///" 

每当我做出改变时,我都要用/etc/init.d/slapd restart启动slapd

以下testing非TLS连接的命令行工作正常;

 ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \ -b dc=mydomain,dc=com -H "ldap://mydomain.com" "cn=roger*" 

但是当我使用这个命令行切换到ldaps时,

 ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \ -b dc=mydomain,dc=com -H "ldaps://mydomain.com" "cn=roger*" 

这是我得到的;

 ldap_url_parse_ext(ldaps://mydomain.com) ldap_create ldap_url_parse_ext(ldaps://mydomain.com:636/??base) ldap_sasl_bind ldap_send_initial_request ldap_new_connection 1 1 0 ldap_int_open_connection ldap_connect_to_host: TCP mydomain.com:636 ldap_new_socket: 3 ldap_prepare_socket: 3 ldap_connect_to_host: Trying 127.0.0.1:636 ldap_pvt_connect: fd: 3 tm: -1 async: 0 TLS: can't connect: A TLS packet with unexpected length was received.. ldap_err2string ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) 

现在,如果我检查netstat -al我可以看到;

 tcp 0 0 *:www *:* LISTEN tcp 0 0 *:ssh *:* LISTEN tcp 0 0 *:https *:* LISTEN tcp 0 0 *:ldaps *:* LISTEN tcp 0 0 *:ldap *:* LISTEN 

我不确定这是否也是重要的…我怀疑是这样;

 openssl s_client -connect mydomain.com:636 -showcerts CONNECTED(00000003) 916:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188: 

我想我已经取得了所有证书等等,这里是一些检查的结果;

如果我这样做

 certtool -e --infile /etc/ssl/certs/ldap_cacert.pem 

我得到链validation输出:validation。

 certtool -e --infile /etc/ssl/certs/mydomain.com_slapd_cert.pem 

给“certtool:最后一个证书不是自签名”,但它似乎没有问题?

我哪里错了? 当然,让openldap在Ubuntu上安全运行应该很容易,不需要火箭科学的学位!

有任何想法吗?

看来我的ssl.ldif文件的语法不正确。 在线上完成不同的指导后,我将其更改为(也是重新生成的自签名证书)。

 dn: cn=config changetype: modify add: olcTLSCipherSuite olcTLSCipherSuite: NORMAL - add: olcTLSCRLCheck olcTLSCRLCheck: none - add: olcTLSVerifyClient olcTLSVerifyClient: never - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/new-ca-cert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/new-ca-key.pem 

这还没有完全解决,但至less现在我可以使用;

 openssl s_client -connect mydomain.com:636 -showcerts 

并且实际上得到结果。 我会更新这个答案,因为我发现更多。

编辑:

我已经写了我的解决schemehttp://rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/这可能会帮助别人。 这么好的!

罗杰的链接已经腐烂,在互联网档案馆的WayBack Machine上,和他在更改网站前最后一个date一样: https ://web.archive.org/web/20150530064010/http://rogermoffatt.com / 2011/08/24 / Ubuntu的OpenLDAP的与- ssltls /

我也冒着在下面追加他的内容:

起点

我假定你有一个使用cn = config(LDAP数据库)进行configuration的工作openldap安装(不安全),而不是旧式的slapd.conf版本。 如果您通过编辑slapd.conf进行更改,则本文的其余部分不适合您!

步骤1

创build一些自签名证书即可开始使用。 如果你已经使用openssl为一个web服务器创build了一些证书,那么第一件事就是你不能使用ldap。 您需要使用不同格式的证书并生成证书,我们需要一个您还没有的新工具。

 sudo -i apt-get update apt-get install gnutls-bin certtool --generate-privkey --outfile /etc/ssl/private/ldap-ca-key.pem certtool --generate-self-signed --load-privkey /etc/ssl/private/ldap-ca-key.pem --outfile /etc/ssl/certs/ldap-ca-cert.pem 

修复您的权限 – 生成的文件需要被openldap组读取。

为此,请将openldap用户添加到ssl-cert组,然后确保证书和密钥由ssl-cert组拥有。 记住目录/ etc / ssl / private对它有严格的权限,所以你需要正确的做到这一点。

 adduser openldap ssl-cert chgrp /etc/ssl/private/ldap-ca-key.pem 

第二步

创build一个合适的ssl.ldif文件以导入configuration数据库。 在这一点上值得一提的是,我在网上看到的那些语法错误都阻止了他们的工作 – 他们默默地失败了,这让你认为他们已经工作了! 特别要注意的是,连字符在语法上是重要的。

 dn: cn=config changetype: modify add: olcTLSCipherSuite olcTLSCipherSuite: NORMAL - add: olcTLSCRLCheck olcTLSCRLCheck: none - add: olcTLSVerifyClient olcTLSVerifyClient: never - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/ldap-ca-cert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/ldap-ca-key.pem 

警告:不要聪明,把TLSCipherSuite改成像HIGH这样聪明的东西:MEDIUM:-SSLv2 – 这是一个openssl指令,现在你会发现你不能重新启动slapd,因为启动时会失败:-(诊断这个,尝试用下面的命令启动slapd;

 slapd -d 16383 

如果你这样做,你可能会看到以下;

 TLS: could not set cipher list HIGH:MEDIUM:+SSLv2. main: TLS init def ctx failed: -1 

你可以通过直接编辑/etc/ldap/slapd.d/cn=config.ldif来解决这个问题。

第三步

导入ssl.ldif文件,并注意你应该看到什么时候它的作品,而不是你会看到什么时候没有。 另外请注意,如果您正在多次运行此操作,则需要更改ssl.ldif文件中的添加以replace。

 ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif -v 

-v给你一个详细的输出。 确保你看到正在打印的新条目,如果它只是说了类似的东西;

 modifying entry "cn=config" modify complete 

那么这并不意味着它已经工作。 这很可能意味着它没有处理文件,因为错误,实际上没有改变。 您需要查看它列出它已修改的条目。 例如,这是一个工作版本(使用replace,而不是添加)

 SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 replace olcTLSCipherSuite: NORMAL replace olcTLSCRLCheck: none replace olcTLSVerifyClient: never replace olcTLSCertificateFile: /etc/ssl/certs/ldap2-ca-cert.pem replace olcTLSCertificateKeyFile: /etc/ssl/private/ldap2-ca-key.pem modifying entry "cn=config" modify complete 

第四步

确保slapd监听ldaps://连接我们再次编辑一个文件(是否有其他人认为使用cn = config会导致比解决更多麻烦?),这次我们需要编辑/etc/default/slapd并更改SLAPD_SERVICES行,以便它具有ldaps:///条目,如图所示;

 SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///" 

第五步

修复不受信任的证书问题。 你会认为我们现在已经完成了,但事实certificate,在另一个文件中有一个非常重要的configuration。 如果现在尝试连接,使用绑定到这样的ldap服务器的命令行;

 ldapsearch -d 9 -D “cn=admin,dc=mydomain,dc=com” -w adminpassword -b “dc=mydomain,dc=com” -H “ldaps://mydomain.com” “objectClass=*” 

你可能会得到;

 TLS: peer cert untrusted or revoked (0x42) TLS: can't connect: (unknown error code). ldap_err2string ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) 

要解决这个问题,编辑文件/etc/ldap/ldap.conf(注意,这不是slapd.conf文件 – 它可能有点令人困惑),并将下面的单行添加到可能是完全注释掉的文件; TLS_REQCERT永远不会

现在它应该工作!