【问题标题】:Two servers with identical config - ldap_bind works on one, fails on the other具有相同配置的两台服务器 - ldap_bind 在一个上工作,在另一个上失败
【发布时间】:2014-01-07 21:03:39
【问题描述】:

我刚刚推出了一个与生产配置相同的开发服务器(CentOS 6.5,相同的 AMP 堆栈)。过去,我必须在同一台机器上运行开发实例(在不同的基于 IP 的虚拟主机下)。 ldap_bind 在旧的 monobox 设置中完美运行。

我有单独的 ssl crt 文件用于生产和开发 (prod & dev)。设置新机器后(使用 puppet - 与生产相同的配置),我复制了开发 crt 文件并确保 apache 配置加载正常。与以前相同的 IP 地址用于开发。

当我尝试在开发系统上对 ldap 进行身份验证时,我收到以下错误:

PHP 警告: ldap_bind() [function.ldap-bind]: Unable to bind to server: Can't contact LDAP server in /some/path/function/functions_security.php on line 1234, referer: http://my.application.com/somescript.php

somescript.php 的第 1234 行是

$r = ldap_bind($ldap_conn, $srvc_dn, $srvc_pass);

无需发布参数,因为它们在生产系统和开发系统之间相同。制作完美无瑕。

我已确认在提供的端口下通过远程登录到 ldap 服务器的开发机器上没有防火墙或网络问题。我可以正常连接。

网络运营人员说请求失败的原因是因为我没有在开发系统上“将证书导入商店”。我用谷歌搜索了一下,但也许我没有使用正确的关键字 - 我没有找到如何检查我的开发“密钥库”中的证书。

我看到keytool 的一些文档,它可以在 .jks 文件中列出证书 - 但我在生产或开发系统上都找不到 .jks 文件。

一些潜在客户/搜索关键字/建议会非常有帮助,因为我目前陷入困境。

【问题讨论】:

    标签: php ssl openssl ldap


    【解决方案1】:

    我相信证书存储在 CentOS 上的/etc/pki/tls/certs/。您可以将开发机器上的内容与生产机器上的内容进行比较

    【讨论】:

    • 在两台机器上,crt 文件都存储在/usr/local/ssl/crt 下。两个系统都使用相同的操作系统(以及通过 puppet 进行的软件配置)。这是两个新系统,对于生产机器,我只是复制了 crt 文件(在创建上面的目录结构之后),确保 apache ssl.conf 指向它们,并且 ldap_bind 正常工作。
    【解决方案2】:

    在任何安装了 openssl 的机器上(我猜你的两台 centos 机器都安装了),试试openssl s_client -connect myserver:ldaps。如果不是标准 (636),请用您的服务器名称替换 myserver,用端口替换 ldaps。按 CTRL+C 并滚动回命令后。您应该会看到类似

    CONNECTED(00000003)
    depth=2 /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
    verify return:1
    depth=1 /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
    verify return:1
    depth=0 /description=zACEv54DP1HaZ8cR/C=DE/CN=XXXX.xxxx.xxxx.com/emailAddress=webmaster@xxxxxxx.com
    verify return:1
    ---
    Certificate chain
     0 s:/description=zACEv54DP1HaZ8cR/C=DE/CN=xxxx.xxxx.xxxx.com/emailAddress=webmaster@xxxxxxx.com
       i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
     1 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
       i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
     2 s:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
       i:/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
    ---
    

    您的 CA 会有所不同,但此示例显示的证书包括安装在服务器上的 CA 证书。检查 prod 和 dev 之间是否存在无法由 prod/dev crt 文件解释的差异,或者是否应该存在差异(CN=xxxx.xxx 部分)。这可能会帮助您找出证书有什么问题。或者,如果您没有在其中一台服务器上获得 CONNECTED(00000003),则 ldap 没有在那里运行。

    另一件事:你说I copied over the development crt files。你也复制了密钥?复制文件后是否重启了 ldap 服务器?

    【讨论】:

    • 我之前使用过 s_client,但只看到了我尝试对其进行身份验证的远程 LDAP 服务器的证书。我也应该在链中看到我的本地证书吗?密钥和证书已复制并在我的 Apache ssl.conf 文件中正确引用。
    • fwiw 我使用openssl s_client -connect ldap.service.company.com在两个系统上获得相同的服务器链
    • 对不起,我好像误会了。我的印象是您在本地的每台机器上运行 LDAP 服务器,其中一台使用 dev 证书,另一台使用 prod 证书。如果两台机器仅使用 Web 服务器的证书,并且都连接到同一个 LDAP 服务器(不在您的一台机器上运行),那么您当然应该看到相同的链。也许 prod apache 服务器和 ldap 服务器的证书使用相同的 CA,但 dev 使用不同的 CA?在连接之前尝试ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);,也许你会得到一些有用的东西。
    • 将调试设置为 7 仍然没有什么新鲜事。与以前相同的错误:Unable to bind to server: Can't contact LDAP server
    • 任何调试信息?你检查 /var/log/httpd/error_log 了吗?如果我处于您的情况,我接下来要做的就是在两台机器运行 ldap 脚本并使用wireshark 比较这些转储时获取两台机器的tcpdump。不过不知道您对网络转储的熟练程度。
    【解决方案3】:

    我必须做两件事才能让它发挥作用。

    1) 将我的服务器证书复制到 /etc/openldap/ldap.conf 中的 TLS_CACERTDIR

    2) 在TLS_CACERTDIR 上运行/usr/sbin/cacertdir_rehash。这一步显然很重要,因为我使用的是 CentOS 6。

    此后,LDAP 与 ldapsearch 和 PHP 的 ldap_bind 一起工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2010-12-30
      • 2011-04-11
      • 2015-12-23
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多