2013-03-06 59 views
2

在我們基於Web的應用程序中,我們支持LDAP認證。它適用於下面的代碼。現在我們希望通過TLS支持LDAP。我們在SUSE Linux Enterprise Server 11上爲我們的客戶託管我們的產品,並且每位客戶可以擁有不同的TLS證書。如何從php/Zend使用LDAP的多個TLS證書?

我的問題是:

  • 如何設置了SUSE服務器(即LDAP客戶端) - 在哪裏放置證書爲每一個客戶,我是否需要修改任何的conf文件?
  • 如何製作通過TLS進行LDAP身份驗證,使用來自php的不同證書。什麼是確切的PHP語法?
  • 服務器的類型是否重要? Exchange,OpenLDAP等?
  • 現在我們有來自Exchange的.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引擎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; 
} 
+0

如果我不完全錯在這裏,證書的數目對PHP編碼端沒有影響。服務器需要相互信任其他證書。您必須在Ldap-Adapter中設置的所有內容都是配置選項'useStartTls = true'。伊莫這是服務器配置,所以也許更好地服務於serverfault.com – Sam 2013-03-07 07:33:06

+0

我認爲我需要指定哪種證書將用於特定的LDAP連接... – Radek 2013-03-07 21:18:43

+0

請參閱http://www.php.net/ manual/de/function.ldap-connect.php#36156 - 你也可以通過'putenv()'設置'TLS_ *'-Stuff。沒有「ZF方式」這樣做;) – Sam 2013-03-07 22:10:18

回答

2

如何建立我們的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服務器設置爲相應的域名爲certificate。並確保您的本地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 
+0

Goooood答案。我會讓我們的開發人員看看它。我接受他們的審查後接受。謝謝。 – Radek 2013-03-27 04:49:50

+0

它工作?你需要更多嗎?我注意到我得到了一筆賞金,但答案沒有被選作「答案」......你是否需要更多的答案來回答這個問題? – bubba 2013-03-28 14:35:28

+0

我試圖推動我們的開發人員研究它...謝謝。 – Radek 2013-04-02 05:56:06