2010-02-03 100 views
2

我想使用.p12證書連接到LDAP服務器,而不是使用用戶名和密碼。 Java的解決方案看起來像如何使用p12證書連接到LDAP服務器

String ldapURL = "ldaps://"+host+":"+port; 

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12"); 
System.setProperty("javax.net.ssl.keyStore",keystore); 
System.setProperty("javax.net.ssl.keyStorePassword", keystorePassword); 

Hashtable env = new Hashtable(); 
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, ldapURL); 
env.put(Context.SECURITY_PROTOCOL, "ssl"); 
env.put(Context.REFERRAL, "follow"); 

try 
{ 
    // Create initial context 
    LdapContext ctx = new InitialLdapContext(env, null); 
    // Perform client authentication using TLS credentials 
    ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "EXTERNAL"); 

    SearchControls ctls = new SearchControls(); 
    // Specify the search filter to match 
    String filter = "(objectClass=*)"; 
    // Search for objects using the filter 
NamingEnumeration answer = ctx.search("ou="+elemType[i]+","+siteSpecificBaseDN, filter, ctls); 

... 

我可以使用python做同樣的事嗎?我只能找到示例顯示如何使用用戶名和密碼與python-ldap連接到LDAP服務器,但這不是我所需要的。如果使用.p12證書是不可能的,如果有使用x509證書(.pem格式)的解決方案,它也可以幫助我。

回答

0

它看起來像ldaptor可以爲您提供此功能。它建立在扭曲之上,支持嵌入在twisted.internet.ssl模塊中的SSL。

參見:ldaptor.protocols.ldap.ldapclient.startTLS()

1

如果您使用Python-LDAP,您可以使用TLS options設置這些參數。

ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, "/path/to/trustedcerts.pem") 
ldap.set_option(ldap.OPT_X_TLS_CERTFILE, "/path/to/usercert.pem") 
ldap.set_option(ldap.OPT_X_TLS_KEYFILE, "/path/to/user.key.pem") 

ds = ldap.initialize("ldaps://ldap.example.com:port/") 
# If using START_TLS instead of ldaps: 
# ds = ldap.initialize("ldap://ldap.example.com:port/") 
# ds.start_tls_s() 

在這種情況下:

  • trustedcerts.pem是信任存儲的等價物。它是您想要的PEM格式的可信證書的串聯。你也可以使用一個帶有個人證書的目錄OPT_X_TLS_CACERTFILE,但我認爲它不被GnuTLS支持,所以它取決於編譯的TLS庫python-ldap和它的OpenLDAP客戶端庫。有關OpenLDAP manual中潛在的直播的更多詳細信息。
  • usercert.pem是您的用戶證書,PEM格式(你必須從你的PKCS#12文件中提取)
  • user.key.pem是你的私有密鑰(再次,它需要從P12文件中提取)

證書,並從PKCS#12文件密鑰提取可以使用這個OpenSSL的完成:

openssl pkcs12 -in userstore.p12 -clcerts -nokeys -out usercert.pem 
openssl pkcs12 -in userstore.p12 -nocerts -nodes -out user.key.pem 

注:如果您提取私鑰(在user.key.pem)這種方式(-nodes) ,它會沒有密碼保護,所以你需要確保這個文件不可被其他人讀取。我不認爲OpenLDAP(甚至更少的Python綁定)讓你交互地提示輸入密碼來解決這個問題,但我不確定。

相關問題