正在通过 SSL 将 Docker 容器连接到企业 LDAP 服务器

Connecting Docker container to corporate LDAP server through SSL

我需要将 Docker 容器连接到企业 LDAP 服务器。

容器的目的是根据公司的 LDAP 服务器对用户进行身份验证。

容器可以在"anonymous"模式下完美查询服务器。问题是当我尝试进行身份验证时。服务器要求以机密方式传输凭据。即通过SSL/TLS.

有趣的是,在我的 Ubuntu 主机上,我能够查询服务器并对其进行身份验证。所以,这适用于我的主机,但不适用于容器

ldapsearch -x -D "uid=<ACCOUNT>,ou=People,o=hp.com" -W -H ldaps://<LDAP DOMAIN> -b "o=hp.com" -s sub 'uid=*'

容器可以匿名查询服务器(没有 SSL)。所以这在容器中有效:

ldapsearch -d8 -x -H ldaps://<LDAP DOMAIN> -b "o=hp.com" -s sub 'uid=*'

这样做:

curl "ldap://<LDAP DOMAIN>/o=hp.com?cn?sub?(sn=rosado)"

现在,我确定这是 SSL 的问题,因为在容器内部...

1)我可以匿名连接到 LDAP 服务器(因为匿名用户不需要保密通信。因此,他们不需要 SSL)。

2) 当 运行 ldapsearch 处于调试模式时,我得到以下报告:

ldapsearch -x -D "uid=<ACCOUNT>,ou=People,o=hp.com" -W -H ldaps://<LDAP DOMAIN> -b "o=hp.com" -s sub 'uid=*

调试输出:

TLS: can't connect: (unknown error code).    ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

我尝试过的一些事情包括:

-将证书从我的主机安装到我的容器。将其放置 /usr/local/share/ca-certificates/ 并执行 update-ca-certificates.

-在容器中使用openssl客户端确保可以建立连接openssl s_client -connect <LDAP DOMAIN>:<PORT>。这是输出:

CONNECTED(00000003)
depth=1 O = hp.com, OU = IT Infrastructure, C = US, O = Hewlett-Packard Company, CN = <CORP INFO> Class 2 Certification Authority
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 <CORP INFO>
---
Server certificate
-----BEGIN CERTIFICATE-----
<CORP INFO>

    Start Time: 1426872988
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)

SSL/TLS 连接失败通常有两个原因:协议不匹配或信任问题。

可以使用网络协议分析器(例如Wireshark)或打开客户端调试(使用ldapsearch参数-d 65535)来诊断协议不匹配。

信任问题也应该在调试输出中可见。但还要检查 ldap.confTLS_CACERTTLS_CACERTDIR 参数,该参数指向包含所有受信任 CA 的文件或目录。确保 docker 容器中的那些与主机上的相同。

检查 openldap 版本和底层 SSL/TLS 实现版本(openldap 可能使用 NSS、GnuTLS 或 OpenSSL)在 docker 容器中是否相同主机。