通过SSL将Docker容器连接到公司LDAP服务器

我需要将Docker容器连接到公司的LDAP服务器。

容器的目的是根据公司的LDAP服务器来validation用户。

容器可以完美地以“匿名”模式查询服务器。 问题是当我尝试authentication。 服务器要求凭证以机密方式传输。 也就是说,通过SSL / TLS。

有趣的是,在我的Ubuntu主机上,我能够查询服务器并进行身份validation。 所以,这在我的主机上,但不在容器上

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)在debugging模式下运行ldapsearch时,得到以下报告:

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

debugging输出:

 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客户端来确保可以build立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等networking协议分析器或打开客户端debugging(使用-d 65535参数到ldapsearch )可以诊断协议不匹配。

信任问题也应在debugging输出中可见。 但是还要检查ldap.confTLS_CACERTTLS_CACERTDIR参数,该参数指向具有所有可信CA的文件或目录。 确保docker集装箱中的货物与主机上的货物相同。

当你在它的时候,检查docker容器和主机上的openldap版本和底层的SSL / TLS实现版本(openldap可能使用NSS,GnuTLS或者OpenSSL)是一样的。