我正在尝试通过 Helm Chart 在 kubernetes 上设置 OpenLDAP。
它部署正确,我能够从容器内部本地以及从集群中的其他容器(如 phpldapadmin)通过端口 389(未加密)访问服务器(通过 URL:openldap.ldap.svc.cluster.local)。
但是我无法使用 tls 访问它。从容器内,如果我运行此命令:ldapsearch -x -ZZ
,我会在日志中得到以下内容:
5e2e6f05 conn=1035 fd=15 ACCEPT from IP=127.0.0.1:44820 (IP=0.0.0.0:389)
5e2e6f05 conn=1035 op=0 EXT oid=1.3.6.1.4.1.1466.20037
5e2e6f05 conn=1035 op=0 STARTTLS
5e2e6f05 conn=1035 op=0 RESULT oid= err=0 text=
TLS: can't accept: (unknown error code).
5e2e6f05 conn=1035 fd=15 closed (TLS negotiation failure)
同样,在本地 openLDAP 容器本身中,如果我尝试,ldapsearch -x -H ldaps://localhost -b "dc=domain,dc=com"
我会得到:
5e2e6a87 conn=1138 fd=15 ACCEPT from IP=127.0.0.1:45638 (IP=0.0.0.0:636)
TLS: can't accept: (unknown error code).
5e2e6a87 conn=1138 fd=15 closed (TLS negotiation failure)
我不知道接下来在调试方面要检查什么。我看到的一个问题是,在 docker 容器中,它应该使用参数运行--hostname
,但我不认为 helm 图表会这样做,而且我不知道是否需要设置主机名。也许它不喜欢我通过主机名localhost
而不是ldap.domain.com
证书的域名访问的事实。如果是这种情况,我仍然不确定如何将主机名设置为ldap
,假设这就是我需要做的。
环境:
我安装了这个图表:https://github.com/helm/charts/tree/master/stable/openldap
它基于这个 docker 镜像:https://github.com/osixia/docker-openldap
并为 helm 图表设置以下参数:
existingSecret: openldap-admin-pass
tls.enabled: true
tls.secret: ldap-tls
persistence.enabled: true
persistence.accessMode: ReadWriteMany
persistence.existingClaim: openldap-vol
我还更改了配置图,以便LDAP_DOMAIN = domain.com
证书本身是由 let's encrypt 的 cert-manager 生成的。证书的域名是ldap.domain.com
.它是使用 cloudflare 的 DNS 验证进行签名的,是有效的证书。
服务器启动日志未显示任何错误,看起来 TLS 配置和证书已正确导入:https://pastebin.com/raw/q9iEZCGN
将不胜感激任何帮助。谢谢。
答案1
我在这里找到了解决方案: https://github.com/osixia/docker-openldap/issues/105
必须在 openLDAP 容器上设置环境变量:LDAP_TLS_VERIFY_CLIENT=try
否则它会期望客户端也拥有自己的证书。