【问题标题】:LDAP Require Cert Never with PHPLDAP 要求证书从不使用 PHP
【发布时间】:2017-02-27 00:04:40
【问题描述】:

我正在尝试通过 ldaps 创建从 php 到活动目录服务器的连接。如果我只使用 ldap 连接,我可以连接到服务器,但这不是安全连接。当我将 php 指向安全连接时,它不会连接。一位同事给了我他用于相同连接的 python 代码,但我在尝试在 php 中实现它时遇到了问题。这是我的php代码:

$connection = ldap_connect($this->ldapserver);
  $adminBind = false;
  if (ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3))
    if (ldap_set_option($connection, LDAP_OPT_REFERRALS, 0))
      if(ldap_set_option($connection, LDAP_OPT_X_TLS_REQUIRE_CERT, 0))
        $adminBind = ldap_bind($connection, $this->ldapadmindn, $this->ldapadminpw);
  if(!$adminBind)
    return false; //server down or admin account unavailable

这是他发给我的python的一部分ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)

问题来自ldap_set_option($connection, LDAP_OPT_X_TLS_REQUIRE_CERT, 0)。当我尝试运行此部分时,我收到 Use of undefined constant LDAP_OPT_X_TLS_REQUIRE_CERT 错误。根据the php page for set option,这是可用的选项之一。有谁知道如何让这个选项起作用?

我看到的一个答案是在 ldap.conf 文件中写入“TLS_REQCERT never”。我希望这个连接忽略证书,因为 Web 服务器会定期连接到另一个活动目录,我需要它来使用证书。

感谢您的帮助。

【问题讨论】:

    标签: php active-directory


    【解决方案1】:

    LDAP_OPT_X_TLS_REQUIRE_CERT 常量自 PHP 7.1 起可用。可能应该更正文档以反映这一点(实际上是我的错误,因为我提交了补丁以将它们添加到文档中,哈哈)。

    另一种选择是在您连接的机器上获取所需的证书,而不是忽略证书。这个问题中有一些关于获得证书的好信息:

    How to save the LDAP SSL Certificate from OpenSSL

    【讨论】:

    • 我已尝试将证书保存到 ldap 查找证书的文件中,但它无法识别新证书。为了找到新证书,我需要做些什么具体的事情吗?我正在使用带有 apache 的 ubuntu 作为 Web 服务器。
    • 您的 ldap.conf 文件是什么样的?你定义了TLS_CACERT 吗?
    • 我确实定义了 TLS_CACERT 并且证书在文件中。我尝试使用ldapsearch -d5 进行一些调试,它确实可以识别来自服务器的证书并将其与我安装的证书匹配。但是,我的 php 程序仍然认为它不是有效的证书。通过在ldap_connect 之前添加ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);,然后查看日志,我收到了这条消息TLS: during handshake: Peer certificate is not trusted: kSecTrustResultRecoverableTrustFailure。有什么想法吗?感谢您的帮助
    • @hellstorm42 我最近设计了一种获取对等证书链的方法,其中包含您可能需要的 CA 证书。 CA 证书需要是签署您的 DC 证书的 CA 的证书。如果您使用this answer's function,则将peer_certificate_chain 部分的输出保存到文件(例如将其保存到/etc/ldap/certs/adcacert.pem),然后通过TLS_CACERT /etc/ldap/certs/adcacert.pem 引用它。
    • 只是补充一下:将peer_certificatepeer_certificate_chain 的字符串保存到一个名为ca-bundle.crt 的文件中然后在TLS_CACERT 中引用该文件可能是最简单的。似乎需要一个包含链中所有证书的文件。因此,如果您有一个颁发 CA 证书和一个根 CA 证书,您将需要该文件中的这两个证书。希望这是有道理的。
    【解决方案2】:

    对于 CentOS 7,WHM - cPanel,这一行解决了这个问题: putenv('LDAPTLS_REQCERT=never');

    把它放在 ldap_connect 行之前。

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多