2016-02-11 56 views
0

我正在編寫一個工具,使端口636上的LDAPS連接到不同的目錄服務。使用c#類的LDAPConnection我現在可以在端口389和636上成功連接到AD服務器。LDAPConnector類中的QueryClientCertificate有什麼作用?

但是,我不明白的是,以前我讀的地方,又增加了下面的代碼來禁用客戶端證書驗證:

public X509Certificate ClientCertFinder(LdapConnection connection,byte[][] trustedCAs) { 
     return null; 
    } 

if (sslEnabled){ 
     ldapConnection.SessionOptions.SecureSocketLayer = sslEnabled; 
     SessionOptions.QueryClientCertificate = new QueryClientCertificateCallback(ClientCertFinder); 
    } 

與上面的代碼,我是不是能夠連接到在端口636(搜索操作拋出An Operation Error Occurred)的Active Directory,但我可以連接到其他目錄服務的端口636只是偶然我刪除

SessionOptions.QueryClientCertificate = new QueryClientCertificateCallback(ClientCertFinder); 

而現在的程序連接到所有的目錄服務,包括港口6的廣告36.

這清楚地表明我不明白使用QueryClientCertificate。有些人可以解釋一下,爲什麼使用這個?

回答

0

當使用一個安全的LDAP連接(LDAPS),您通常使用串聯這兩種方式連接到LDAP服務器:

  1. QueryClientCertificate - 檢索根證書頒發機構的字節數組證書
  2. VerifyServerCertificate - 驗證證書頒發給你連接到

通過刪除該行代碼的第三方,所有你正在做的是繞過客戶端的CERTI的檢索ficate,這也意味着你繞過根CA進行驗證。但是,正如您可能意識到的那樣,爲了使連接仍能正常建立,您需要執行SSL握手,並將SecureSocketLayer標誌設置爲true。實際驗證可以使用委託,只是返回true強制:

ldapConnection.SessionOptions.SecureSocketLayer = SSL; 
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 

請記住,雖然,這是不是你總是想要做的事,尤其是當安全成爲一個問題。目錄服務器中可能存儲有令人難以置信的敏感用戶信息,因此很容易理解這些信息存在的原因。但是,如果要連接的服務器正在發行自簽名證書(因爲誰願意支付真實的證書?),則此過程是必需的,因爲自簽名證書對於根目錄無效CA.

+0

感謝您的解釋。正如你所說,我意識到使用屬性「VerifyServerCertificate」。但我仍然不明白,爲什麼要刪除委派給「QueryClientCertificate」的分配將使連接通過。 –

0

如果您想使用客戶端證書(例如在智能卡上)向LDAP服務器進行身份驗證,則使用QueryClientCertificate回調。如果您只是想使用憑據(例如用戶名和密碼),則這不是必需的。

+0

嘿,謝謝。這是我認爲是使用,所以我從委託函數返回null。但是當我返回null時,我無法通過LDAPS連接到AD,並拋出異常「發生操作錯誤」。當我刪除委派的任務時,連接完成。現在我想知道,當我沒有委託時,在這個回調中會發生什麼。 –

+0

我會冒險猜測它根本不會嘗試客戶端證書AuthN –

相關問題