OpenLDAP SSL 出现“连接丢失”错误

OpenLDAP SSL 出现“连接丢失”错误

我在 Alpine 3.8 系统上安装了 OpenLDAP 2.4.50,并且有两个 Debian 10 客户端(我们称之为 A 和 B)尝试连接 ldap 服务器。我的问题是第一个可以,而第二个不能。

A 和 B 是相同的机器,都安装了最新的 Debian 10。客户端 A 可以使用 连接 ldap 服务器ldapsearch -x -b "dc=mydomain,dc=tld" -H ldaps://ldap.mydomain.tld/,但客户端 B 失败。以下是客户端 B 尝试连接时服务器显示的内容:

Jul 16 12:46:39 reglisse local4.debug slapd[17451]: conn=1132 fd=22 ACCEPT from IP=xxx.xxx.xxx.xxx:45444 (IP=0.0.0.0:636)
Jul 16 12:46:39 reglisse local4.debug slapd[17451]: conn=1132 fd=22 TLS established tls_ssf=256 ssf=256
Jul 16 12:46:39 reglisse local4.debug slapd[17451]: conn=1132 fd=22 closed (connection lost)
  • 服务器证书已经建立certbot
  • 客户端 A 和客户端 B 都可以使用 以纯 ldap(无 SSL)成功读取 ldap 数据库ldapsearch -x -b "dc=mydomain,dc=tld" -H ldap://ldap.mydomain.tld/ -v。这应该证明没有网络问题,并且服务器正确监听端口 389。
  • 客户端A和客户端B都可以成功连接到ldaps端口openssl s_client -connect ldap.mydomain.tld:636 -showcerts。这应该证明服务器正确监听了636端口。
  • 客户端 A 和客户端 B 都ldap-utils安装了相同版本的软件包,并且ldd /usr/bin/ldapsearch显示两个二进制文件都是针对相同的库构建的。这应该证明两个客户端是相同的。
  • 该服务器slapd.conf绝对没有什么特别之处:

 

suffix dc=mydomain,dc=tld
rootdn cn=admin,dc=mydomain,dc=tld
rootpw "xxxxxxxxxxx"
TLSCertificateKeyFile /etc/openldap/certs/privkey.pem
TLSCACertificateFile /etc/openldap/certs/fullchain.pem
TLSCertificateFile /etc/openldap/certs/cert.pem
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/inetorgperson.schema

那么,我在这里做错了什么?

答案1

我发现ldapsearch有一个-d选项可以显示有趣的东西:

$ ldapsearch -x -b "dc=mydomain,dc=tld" -H ldaps://ldap.mydomain.tld/ -v -d1
ldap_url_parse_ext(ldaps://ldap.mydomain.tld/)
ldap_initialize( ldaps://ldap.mydomain.tld:636/??base )
ldap_create
ldap_url_parse_ext(ldaps://ldap.mydomain.tld:636/??base)
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP ldap.mydomain.tld:636
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 45.67.80.98:636
ldap_pvt_connect: fd: 3 tm: -1 async: 0
attempting to connect:
connect success
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)

因此,看起来服务器 ldap 证书不受客户端 B 信任。为了解决这个问题,我必须在中设置以下行/etc/ldap/ldap.conf

TLS_CACERT  /etc/ssl/certs/ca-certificates.crt

有些人可以使用以下方法解决类似问题:

TLS_REQCERT allow

/etc/ldap/ldap.conf似乎是大多数 ldap 客户端使用的配置文件。客户端 A 已经有了这个文件,这就是它能正常工作的原因。

相关内容