正在通过 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.conf
的 TLS_CACERT
或 TLS_CACERTDIR
参数,该参数指向包含所有受信任 CA 的文件或目录。确保 docker 容器中的那些与主机上的相同。
检查 openldap 版本和底层 SSL/TLS 实现版本(openldap 可能使用 NSS、GnuTLS 或 OpenSSL)在 docker 容器中是否相同主机。
我需要将 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.conf
的 TLS_CACERT
或 TLS_CACERTDIR
参数,该参数指向包含所有受信任 CA 的文件或目录。确保 docker 容器中的那些与主机上的相同。
检查 openldap 版本和底层 SSL/TLS 实现版本(openldap 可能使用 NSS、GnuTLS 或 OpenSSL)在 docker 容器中是否相同主机。