Как подключиться к серверу LDAP с помощью сертификата p12 - PullRequest
2 голосов
/ 03 февраля 2010

Я хочу подключиться к серверу LDAP, используя сертификат .p12 вместо имени пользователя и пароля.Решение Java для этого выглядит так:

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?Я мог только найти примеры, показывающие, как подключиться к серверу LDAP с помощью python-ldap, используя имя пользователя и пароль, но это не то, что мне нужно.Если это невозможно с использованием сертификата .p12, это также поможет мне, если есть решение с использованием сертификатов x509 (формат .pem).

Ответы [ 2 ]

1 голос
/ 23 июня 2010

Если вы используете python-ldap, вы можете использовать опции TLS для установки этих параметров.

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 .
  • usercert.pem - это ваш сертификат пользователя в формате PEM (вам придется извлечь его из файла PKCS # 12)
  • user.key.pem - это ваш закрытый ключ (опять же, его необходимо извлечь из файла p12)

Извлечение сертификата и ключа из файла PKCS # 12 можно выполнить с помощью OpenSSL с помощьюthis:

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) позволяет вам интерактивно запрашивать пароль, чтобы обойти эту проблему, но я не уверен.

0 голосов
/ 03 февраля 2010

Похоже, ldaptor может предоставить вам эту функциональность. Он построен на основе Twisted, который поддерживает SSL, встроенный в модуль twisted.internet.ssl ​​.

См .: ldaptor.protocols.ldap.ldapclient.startTLS()

...