我在 Centos 7 主机上运行了一个 OpenLDAP 2.4.39 服务器,该服务器填充了最少的数据集。当不使用 TLS 时,它可以按预期工作。我今天使用它与 dokuwiki 进行身份验证。我从 Namecheap/Comodo 购买了 SSL,并试图让它正常工作。
例子:
root@smtp:~# ldapsearch -h ldap.foo.bar -D cn=Manager,dc=foo,dc=bar -W -LLL -b ou=people,dc=foo,dc=bar "(uid=baz)"
Enter LDAP Password:
dn: uid=baz,ou=people,dc=foo,dc=bar
objectClass: top
objectClass: inetOrgPerson
objectClass: organizationalPerson
cn:: SGFucyDDhWdlIE1hcnRpbnNlbg==
displayName:: SGFucyDDhWdlIE1hcnRpbnNlbg==
givenName:: SGFucyDDhWdl
mail: [email protected]
mobile: 12345678
sn: Doe
uid: baz
如果我尝试强制 TLS,事情就会改变。
root@smtp:~# ldapsearch -h ldap.foo.bar -D cn=Manager,dc=foo,dc=bar -W -LLL -b ou=people,dc=foo,dc=bar -ZZ "(uid=baz)"
ldap_start_tls: Connect error (-11)
additional info: A TLS packet with unexpected length was received.
root@smtp:~# ldapsearch -h ldap.foo.bar -D cn=Manager,dc=foo,dc=bar -W -LLL -b ou=people,dc=foo,dc=bar -ZZ -d -1 "(uid=baz)"
...
...
TLS: can't connect: A TLS packet with unexpected length was received..
ldap_err2string
ldap_start_tls: Connect error (-11)
additional info: A TLS packet with unexpected length was received.
LDAP 服务器上的配置。
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
structuralObjectClass: olcGlobal
entryUUID: 5760d8da-0f87-1035-85b1-9b4063f1519b
creatorsName: cn=config
createTimestamp: 20151025171240Z
olcIdleTimeout: 300
olcLogLevel: none
olcTLSCACertificateFile: /etc/openldap/tls/ldap.foo.bar.ca_bundle
olcTLSCertificateFile: /etc/openldap/tls/ldap.foo.bar.crt
olcTLSCertificateKeyFile: /etc/openldap/tls/ldap.foo.bar.key
olcTLSCipherSuite: HIGH:MEDIUM:+SSLv2
entryCSN: 20151025205018.128335Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20151025205018Z
[root@ldap tls]# ls -l
total 16
-rw-r--r-- 1 root root 5630 Oct 25 17:14 ldap.foo.bar.ca_bundle
-rw-r--r-- 1 root root 2240 Oct 25 17:14 ldap.foo.bar.crt
-r-------- 1 root root 3243 Oct 25 17:14 ldap.foo.bar.key
[root@ldap tls]# file ldap.foo.bar.ca_bundle
ldap.foo.bar.ca_bundle: PEM certificate
[root@ldap tls]# file ldap.foo.bar.crt
ldap.foo.bar.crt: PEM certificate
[root@ldap tls]# file ldap.foo.bar.key
ldap.foo.bar.key: PEM RSA private key
客户端上的配置:我已将 CA 包添加到客户端 ca 证书中。客户端是 Debian 主机,我将包复制到该主机/usr/local/share/ca-certificates/
并运行命令update-ca-certificates
从我所看到和读到的内容来看,这应该可行。但事实并非如此。如果我尝试从 ldap 服务器本身运行相同的搜索,它也不起作用。我正在努力进一步调试,因为我不知道从哪里开始。有什么建议可以让我研究一下如何让它工作?所有配置文件在发布之前都已手动编辑,所以我可能犯了错误,但我认为情况并非如此。
在收到请求后稍后添加。
Oct 25 20:50:54 ldap slapd[21177]: daemon: shutdown requested and initiated.
Oct 25 20:50:54 ldap slapd[21177]: slapd shutdown: waiting for 0 operations/tasks to finish
Oct 25 20:50:54 ldap slapd[21177]: slapd stopped.
Oct 25 20:50:54 ldap slapd[21670]: @(#) $OpenLDAP: slapd 2.4.39 (Sep 29 2015 13:31:12) $
[email protected]:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd
Oct 25 20:50:54 ldap slapd[21673]: hdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
Expect poor performance for suffix "dc=foo,dc=bar".
Oct 25 20:50:54 ldap slapd[21673]: slapd starting
Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (uid) not indexed
Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (gidNumber) not indexed
Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (memberUid) not indexed
Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (uid) not indexed
Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (gidNumber) not indexed
Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (memberUid) not indexed
Oct 26 07:30:08 ldap slapd[21673]: daemon: shutdown requested and initiated.
Oct 26 07:30:08 ldap slapd[21673]: slapd shutdown: waiting for 0 operations/tasks to finish
Oct 26 07:30:08 ldap slapd[21673]: slapd stopped.
Oct 26 07:30:08 ldap slapd[23274]: @(#) $OpenLDAP: slapd 2.4.39 (Sep 29 2015 13:31:12) $
[email protected]:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd
Oct 26 07:30:08 ldap slapd[23275]: slapd starting
[root@ldap log]#
看到此日志后,我将 /usr/share/openldap-servers/DB_CONFIG.example 添加到 /var/lib/ldap/DB_CONFIG 并完成了systemctl restart slapd
。我没有专注于建立和运行正确的索引,因为我希望 TLS 先运行。
答案1
一般来说,
- 借助 SSL,通常可以更轻松地诊断 TLS/SSL 错误瑞士军刀 openssl命令比输出一个完整的 C/S SSL 应用程序; 这里特别是 openssl 的客户端子命令可能会有帮助。
- olc 通过组合多个 olcLogLevels 提供丰富的诊断输出;参见表 5.1表 5.1:openldap 的 slapd.conf 参考的调试级别。如果我没记错的话,它的标志数值小于或等于“BER”,从而启用(也)SSL/TLS 跟踪。
话虽如此 - 从上面的 olc 列表来看
olcTLSVerifyClient
不存在,更不用说设置为“要求”或“允许”。
MECH_AND_URL="-H ldapi:///" # or whatever your setup needs; your mileage may vary
ldapsearch -b cn=config $MECH_AND_URL "(cn=config)" olcTLSVerifyClient -LLL
如果确实没有任何结果,则创建并设置它:
ldapmodify $MECH_AND_URL <<EOF
dn: cn=config
changetype: modify
add: olcTLSVerifyClient
olcTLSVerifyClient: allow
-
EOF
答案2
我的问题的答案比最初想象的要简单。在我之前的配置中,我有以下设置。
olcTLSCipherSuite: HIGH:MEDIUM:+SSLv2
如您所见,它没有明确允许 TLS。我使用此设置重新配置,现在它运行正常。
olcTLSCipherSuite: HIGH:+SSLv3:+TLSv1:MEDIUM:+SSLv2:@STRENGTH:+SHA:+MD5:!NULL
我可能会在以后删除 SSLv2 和 MD5。我无法确定保留它们是否至少在客户端不支持其他任何内容的情况下提供一定程度的实用性。