如何从php/Zend为LDAP使用多个TLS证书?

如何从php/Zend为LDAP使用多个TLS证书?,php,zend-framework,ldap,certificate,Php,Zend Framework,Ldap,Certificate,在基于web的应用程序中,我们支持LDAP身份验证。它可以与下面的代码配合使用。现在我们希望通过TLS支持LDAP。我们在SUSE Linux Enterprise Server 11上为客户托管我们的产品,每个客户都可以拥有不同的TLS证书 我的问题是: 如何设置SUSE服务器(即LDAP客户端)——在何处放置每个客户的证书,我是否需要编辑任何conf文件 如何使用来自php的不同证书通过TLS进行LDAP身份验证。确切的php语法是什么 服务器的类型是否重要?Exchange、OpenLD

在基于web的应用程序中,我们支持LDAP身份验证。它可以与下面的代码配合使用。现在我们希望通过TLS支持LDAP。我们在SUSE Linux Enterprise Server 11上为客户托管我们的产品,每个客户都可以拥有不同的TLS证书

我的问题是:

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

  • SUSE Linux企业服务器11(x86_64)
  • ldapsearch:@(#)$OpenLDAP:ldapsearch 2.4.26(2012年9月26日13:14:42)
  • PHP版本5.4.9
  • Zend Engine v2.4.0

从阅读中我了解到我可以使用不同的证书,但我不知道如何使用

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;
}
如何设置我们的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的证书相同。这是导入域名的地方,当您创建/请求证书时,它需要与您将要使用它的域名匹配。有关更多详细信息,请参阅

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

你真的不需要在这里做什么特别的事。确保使用名为certificate的适当域设置LDAP服务器。并确保本地openladap客户端(运行php)通过其配置文件识别该证书的签名权限。然后请注意,许多Zend示例()使用配置文件来设置Zend LDPA客户端并打开TLS。您还可以使用Zend_Ldap::setOptions()-请参阅

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

现在我们有交易所的.cer证书。OpenLDAP可以吗?或者它必须(如何)转换为.pem

见:


如果我没有完全错的话,证书的数量对PHP编码方面没有影响。服务器需要相互信任证书。您需要在Ldap适配器中设置的全部内容是配置选项
useStartTls=true
。在我看来,这是服务器配置,所以在serverfault.com上服务可能更好。我认为我需要以某种方式指定哪个证书将用于特定的LDAP连接…请参阅-您也可以通过
putenv()
设置那些
TLS.*
-东西。没有“ZF方式”可以做到这一点;)我不明白的是如何将特定的服务器证书与服务器名称链接起来。从您提供的链接
中,您要连接到的服务器的名称很重要。如果您在“ldaps://”URI中指定的服务器名称与其证书中的服务器名称不匹配,它将投诉
gooood答案。我会让我们的开发者去看看。我接受他们的审查后。谢谢,有用吗?你还需要更多吗?我注意到我得到了赏金,但答案并没有被选为“答案”。。。你还需要更多的时间来回答这个问题吗?我试着让我们的开发者去研究它…谢谢。
openssl x509 -inform der -in certificate.cer -out certificate.pem