【问题标题】:How to use multiple TLS certificates for LDAP from php/Zend?如何从 php/Zend 为 LDAP 使用多个 TLS 证书?
【发布时间】:2013-02-22 00:08:13
【问题描述】:

在我们基于 Web 的应用程序中,我们支持 LDAP 身份验证。它适用于下面的代码。现在我们要支持 LDAP over TLS。我们在 SUSE Linux Enterprise Server 11 上为客户托管我们的产品,每个客户可以拥有不同的 TLS 证书。

我的问题是:

  • 如何设置 SUSE 服务器(即 LDAP 客户端)- 为每个客户放置证书的位置,我需要编辑任何 conf 文件吗?
  • 如何使用来自 php 的不同证书通过 TLS 进行 LDAP 身份验证。什么是准确的 php 语法?
  • 服务器的类型是否重要? Exchange、OpenLDAP 等?
  • 现在我们有来自 Exchange 的 .cer 证书。对于 OpenLDAP 是否可以,或者必须将其转换(如何)为 .pem?

SUSE 服务器 = LDAP 客户端配置

  • SUSE Linux Enterprise Server 11 (x86_64)
  • ldapsearch:@(#) $OpenLDAP:ldapsearch 2.4.26(2012 年 9 月 26 日 13:14:42)
  • PHP 版本 5.4.9
  • Zend 引擎 v2.4.0

通过阅读http://php.net/ldap_connect,我了解到我可以使用不同的证书,但我不知道如何使用。

function authenticateZendAuth($username, $password){
   require_once 'Zend/Auth.php';
   $auth = Zend_Auth::getInstance();

   $ldapOptions = getConfigVariableValue('->ldap');

   $options = $ldapOptions->toArray();
   unset($options['log_path']);

   require_once 'Zend/Auth/Adapter/Ldap.php';
   $adapter = new Zend_Auth_Adapter_Ldap($options, $username, $password);

   $authenticated = $auth->authenticate($adapter);

   $log_path = $ldapOptions->log_path;
   if ($log_path) {
       $messages = $authenticated->getMessages();

       require_once("Zend/Log.php");
       require_once("Zend/Log/Writer/Stream.php");
       require_once("Zend/Log/Filter/Priority.php");
       $logger = new Zend_Log();
       $logger->addWriter(new Zend_Log_Writer_Stream($log_path));
       $filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
       $logger->addFilter($filter);

       foreach ($messages as $i => $message) {
           if ($i-- > 1) { // $messages[2] and up are log messages
               $message = str_replace("\n", "\n  ", $message);
               $logger->log("Ldap: $i: $message", Zend_Log::DEBUG);
           }
       }
   }

   return $authenticated;
}

【问题讨论】:

  • 如果我在这里没有完全错,证书的数量对 PHP 编码端没有影响。服务器需要相互信任证书。您必须在 Ldap-Adapter 中设置配置选项useStartTls=true。 Imo 这是服务器配置,所以最好在 serverfault.com 上提供服务
  • 我认为我需要以某种方式指定将用于特定 LDAP 连接的证书...
  • 参见php.net/manual/de/function.ldap-connect.php#36156 - 您也可以通过putenv() 设置这些TLS_*-Stuff。没有这样做的“ZF-Way”;)
  • 我不明白的是如何将特定的服务器证书与服务器名称相关联。从您提供的链接The name of the server you're connecting to is important. If they server name you specify in the "ldaps://" URI does not match the name of the server in it's certificate, it will complain

标签: php zend-framework ldap certificate


【解决方案1】:

如何设置我们的 SUSE 服务器(即 LDAP 客户端) - 为每个客户放置证书的位置,我需要编辑任何 conf 文件吗?

如果您使用的是 openssl (slapd),那么您将证书放在哪里并不重要,只要您可以将配置文件设置为指向即可。它可能看起来像这样:

TLSCACertificateFile    /usr/var/openldap-data/cacert.pem 
TLSCertificateFile          /usr/var/openldap-data/servercrt.pem 
TLSCertificateKeyFile   /usr/var/openldap-data/serverkey.pem 

您需要申请(或创建您自己的)证书,这些证书与您用于 HTTPS 的证书相同。这是导入域名的地方,当您创建/请求证书时,它需要与您将要使用它的域名相匹配。请参阅:http://www.openldap.org/pub/ksoper/OpenLDAP_TLS.html 了解更多详情。

如何使用来自 php 的不同证书通过 TLS 进行 LDAP 身份验证。什么是准确的 php 语法?

你真的不需要在这里做任何特别的事情。确保使用适当的域名证书设置 LDAP 服务器。并确保您的本地 openladap 客户端(运行您的 php)通过其配置文件识别该证书的签名权限。然后请注意,许多 Zend 示例 (http://files.zend.com/help/Zend-Framework/zend.auth.adapter.ldap.html) 使用配置文件来设置 Zend LDPA 客户端并打开 TLS。您也可以使用 Zend_Ldap::setOptions() - 请参阅 http://framework.zend.com/manual/1.12/en/zend.auth.adapter.ldap.html 上的注释

服务器的类型是否重要? Exchange、OpenLDAP 等? 不,不是。我的意思是,配置 LDAP 服务器很重要,但 php 客户端根本不关心。

现在我们有来自 Exchange 的 .cer 证书。这对 OpenLDAP 来说可以吗,还是必须(如何)转换为 .pem?

见:http://www.sslshopper.com/article-most-common-openssl-commands.html

openssl x509 -inform der -in certificate.cer -out certificate.pem

【讨论】:

  • 很好的答案。我会让我们的开发人员看看它。我接受他们的审查后。谢谢。
  • 成功了吗?你需要更多吗?我注意到我得到了赏金,但答案没有被选为“答案”……你还需要回答这个问题吗?
  • 我试图推动我们的开发人员进行调查...谢谢。
猜你喜欢
  • 2017-02-27
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2021-05-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多