我就是无法让这个(与 openldap 的 TLS 连接)工作,希望得到一些帮助。
我在 ubuntu 10.04 LTS 上有一个正常运行的 openldap 服务器,它配置为使用 cn=config,并且我能找到的有关 TLS 的大部分信息似乎都使用了较旧的 slapd.conf 文件 :-(
我基本上按照这里的说明进行操作https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html加上我在这里和其他地方读过的东西——当然这可能是问题的一部分,因为我还不完全理解这一切!
我创建了一个 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:///"
每次我做出改变,我都会重新启动 slapd/etc/init.d/slapd restart
以下命令行测试非 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
我得到链验证输出:已验证。
certtool -e --infile /etc/ssl/certs/mydomain.com_slapd_cert.pem
给出“certtool:最后一个证书不是自签名的”但除此之外似乎没问题?
我哪里做错了?让 openldap 在 ubuntu 上安全运行应该很容易,不需要火箭科学学位!
有任何想法吗?
答案1
罗杰的链接从那时起就腐烂了,以下是互联网档案馆 WayBack Machine 上的链接,截至他更改网站之前最后一次存档的日期:https://web.archive.org/web/20150530064010/http://rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/
我也擅自在下面附加了他的内容:
起点
我假设您有一个有效的 openldap 安装(不安全),使用 cn=config(LDAP 数据库)进行配置,而不是使用旧式 slapd.conf 变体。如果您通过编辑 slapd.conf 进行更改,那么本文的其余部分不适合您阅读!
步骤1
创建一些自签名证书以开始使用。如果您已经使用 openssl 为 Web 服务器创建了一些证书,那么首先会让您感到困惑的是它们无法与 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
第二步
创建合适的 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/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 文件中将添加更改为替换。
ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif -v
-v 为您提供详细输出。请确保您看到打印出来的新条目,如果它只是显示类似以下内容:
modifying entry "cn=config"
modify complete
那么这并不意味着它已经成功了。这很可能意味着由于错误它没有处理文件,并且实际上不会做出任何更改。您需要查看它列出已修改的条目。例如,这是一个工作版本(使用替换,而不是添加)
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:///"
第五步
修复不受信任的证书问题。您可能认为我们现在已经完成了,但事实证明另一个文件中有一个配置非常重要。如果您现在尝试连接,请使用绑定到 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 永远不会
现在它应该可以工作了!
答案2
我的 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
这还没有完全解决问题,但至少现在我可以使用;
openssl s_client -connect mydomain.com:636 -showcerts
并真正得到结果。当我发现更多信息时,我会更新此答案。
编辑:
我已经把我的解决方案写在http://rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/这可能会对其他人有所帮助。真是太麻烦了!
答案3
我解决了一些问题,以使 Roger 和 Ricky 的答案能够发挥作用,并想将其中的一些内容放在这里。
第一步的更新
创建自签名证书时,我只需输入这些字段的数据。其余部分我可以跳过,无需指定:
- 通用名称:my.domain.com
- 证书将在(天)后过期:999999
- 该证书是否属于某个机构? (y/N):N
- 输入证书主体的 IP 地址:200.200.200.200
设置证书文件权限的命令如下:
chgrp ssl-cert /etc/ssl/private/ldap-ca-key.pem
chgrp ssl-cert /etc/ssl/certs/ldap-ca-cert.pem
chmod g+r /etc/ssl/private/ldap-ca-key.pem
chmod g+r /etc/ssl/certs/ldap-ca-cert.pem
检查它们:
ls -al /etc/ssl/certs/ldap-ca-cert.pem
ls -al /etc/ssl/private/ldap-ca-key.pem
应该显示:
-rw-r--r-- 1 root ssl-cert 1484 Apr 9 17:31 /etc/ssl/certs/ldap-ca-cert.pem
-rw-r----- 1 root ssl-cert 8289 Apr 9 16:29 /etc/ssl/private/ldap-ca-key.pem
还要确保文件的大小不为 0。如果是,则表示您没有正确制作证书,则需要再次制作。
第三步的更新
如果你不确定 ldap 中的当前设置是什么,不知道是否应该使用“添加”或“替换”,那么你可以运行此行来检查:
sudo slapcat -b cn=config | grep olcTLS
如果你没有看到条目,那么你仍然需要使用“添加”
新支票
我遇到的另一个问题是,我的机器主机名与我在证书中输入的通用名称不匹配。为了在 Ubuntu 16.04 机器上正确设置主机名,我运行了:
hostnamectl set-hostname qa-data.theaccesshub.com
这是我应用 ldif 文件时出现‘80’错误的原因:
ldap_modify: Other (e.g., implementation specific) error (80)
另外,不要忘记在您的机器上打开端口 636。否则,当您尝试访问该端口时,您将遇到连接超时。
结论
所有这些让我的 SSL/TLS 工作顺利。当与 LDAP Admin 连接时,它会提示您有关自签名证书的信息,但您可以确认,一切正常。