openLDAP 代理因 ldaps

问题描述

这个问题让我有点发疯。 我正在尝试将 openLDAP 代理配置到 Active Directory,只要我对 AD 使用未加密的 ldap,它就可以正常工作。但我想通过 LDAP 保护代理和 AD 之间的连接。

让我发疯的是,在我为代理本身启用 LDAP 之前,这一直有效。现在我无法让它运行,即使我撤消了我的更改。

这是 slapd.conf 的样子:

# Include schemas
include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/java.schema
include         /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/openldap.schema
include         /etc/openldap/schema/ppolicy.schema
include         /etc/openldap/schema/collective.schema

include         /etc/openldap/schema/local.schema

allow bind_v2

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

modulepath  /usr/lib/openldap
modulepath  /usr/lib64/openldap
moduleload  back_ldap
moduleload  rwm

loglevel        256

#LDAPS Settings

TLSCipherSuite HIGH:MEDIUM:-SSLv3
TLSCertificateFile /etc/openldap/cacerts/server.crt
TLSCertificateKeyFile /etc/openldap/cacerts/server.key
TLSCACertificateFile /etc/openldap/cacerts/CAs.pem

### Database deFinition (Proxy to AD) #########################################
database                ldap
readonly                no
protocol-version        3
rebind-as-user
uri                     "ldaps://ad-server.internal.de:636"
suffix                  "dc=ad,dc=internal,dc=de"

现在,当我搜索时出现以下错误(ldaps 或 ldap)。 当我将 uri 更改为“ldap://ad-server.internal.de:389”时,两个查询都可以正常工作

ldapsearch -h localhost:389 -D "CN=admin,OU=User,DC=ad,DC=internal,DC=de" -W -b DC=ad,DC=de '(objectclass=person)'

ldapsearch -H ldaps://localhost:636 -D "CN=admin,DC=de '(objectclass=person)'

=>

ldap_bind: Server is unavailable (52)
        additional info: Proxy operation retry Failed

这不是证书错误,因为来自同一主机的直接 ldapsearch 工作正常:

ldapsearch -H ldaps://ad-server.internal.de:636 -D "CN=admin,DC=de '(objectclass=person)'

这是日志的样子:

Jun 09 12:06:06 adproxy.internal.de slapd[94952]: conn=1000 fd=12 ACCEPT from IP=127.0.0.1:47458 (IP=0.0.0.0:389)
Jun 09 12:06:06 adproxy.internal.de slapd[94952]: conn=1000 op=0 BIND dn="cn=admin,ou=User,dc=ad,dc=de" method=128
Jun 09 12:06:06 adproxy.internal.de slapd[94952]: conn=1000 op=0 ldap_back_retry: retrying URI="ldaps://ad-server.internal.de:636" DN=""
Jun 09 12:06:06 adproxy.internal.de slapd[94952]: conn=1000 op=0 RESULT tag=97 err=52 text=Proxy operation retry Failed
Jun 09 12:06:06 adproxy.internal.de slapd[94952]: conn=1000 op=1 UNBIND
Jun 09 12:06:06 adproxy.internal.de slapd[94952]: conn=1000 fd=12 closed

如果知道为什么会发生这种情况,我们将不胜感激。

编辑:

我做了更多的挖掘,它实际上似乎是一个证书问题。连接的 tcpdump 返回此错误

TLSv1.2 Record Layer: Alert (Level: Fatal,Description: UnkNown CA)

AD 证书是自签名的,不幸的是我对此没有发言权,所以我无法更改。

在标准配置中,我在运行 ldapsearch 时遇到相同的错误。我可以使用两种方法运行 ldapsearch:

  1. 在 ldap.conf 中设置 TLS_REQCERT never
  2. 设置环境变量 LDAPTLS_REQCERT=never

我知道这并不理想,但这不应该是最终配置,我只是想让它先运行。

然而 slapd 似乎忽略了两者,因为我仍然在 tcpdump 中遇到相同的错误,slapd 调试仍然给我以下内容

TLS trace: SSL_connect:before/connect initialization
TLS trace: SSL_connect:SSLv2/v3 write client hello A
TLS trace: SSL_connect:SSLv3 read server hello A
TLS certificate verification: depth: 0,err: 20,subject: /CN=ad-server.internal.de,issuer: /CN=ad-server.internal.de
TLS certificate verification: Error,unable to get local issuer certificate
TLS trace: SSL3 alert write:fatal:unkNown CA
TLS trace: SSL_connect:error in error
TLS trace: SSL_connect:error in error
TLS: can't connect: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify Failed (unable to get local issuer certificate).

我尝试将自签名证书添加到 ldap.conf 和 openssl 的受信任锚点,但两者都不起作用。我还注意到我无法使用 openssl 来验证自签名证书,而我可以在我的 PC 上执行相同操作...

我的电脑:

$ openssl version
OpenSSL 1.1.1h  22 Sep 2020

$ openssl verify server.crt
error server.crt: verification Failed
CN = ad-server.internal.de
error 18 at 0 depth lookup: self signed certificate

$ openssl verify -CAfile server.crt server.crt
server.crt: OK

在服务器上时 (REHL 7.9):

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

$ openssl verify server.crt
server.crt: CN = ad-server.internal.de
error 20 at 0 depth lookup: unable to get local issuer certificate

$ openssl verify -CAfile server.crt server.crt
server.crt: CN = ad-server.internal.de
error 20 at 0 depth lookup: unable to get local issuer certificate

据我所知,我的 PC 上的结果是自签名证书的预期行为。我已经检查过了,但它是 RHEL 7.9 上可用的最新版本

那么有没有人知道我该怎么做

  1. 获取 SLAPD 以遵守 TLS_REQCERT 或 LDAPTLS_REQCERT 设置或
  2. openssl 来验证自签名证书

谢谢!

解决方法

我终于找到了忽略证书验证错误的可能性。这不是最佳解决方案,但由于 RHEL7.9 版本中的自签名证书和 openssl 问题,我现在完全满足于让它运行。最终的解决方案应该是让 AD 部门从我们的 CA 那里获得一个证书,虽然我不知道我是否可以说服他们这样做。

因此,虽然 LDAP 代理似乎忽略了 ldap.conf 中的 TLS_REQCERT none 设置,但有可能直接在 slapd.conf 中执行此操作:

### Database definition (Proxy to AD) #########################################
database                ldap
readonly                no
protocol-version        3
rebind-as-user
uri                     "ldaps://ad-server.internal.de:636"
suffix                  "dc=ad,dc=internal,dc=de"
tls                     start tls_reqcert=never

最后一行消除了验证错误。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...