如何使用p12证书连接到LDAP服务器

时间:2010-02-03 16:09:38

标签: python ldap certificate pkcs#12

我想使用.p12证书连接到LDAP服务器,而不是使用用户名和密码。这个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做同样的事吗?我只能找到一些示例,展示如何使用用户名和密码使用python-ldap连接到LDAP服务器,但这不是我需要的。如果使用.p12证书是不可能的,如果有使用x509证书(.pem格式)的解决方案,它也会对我有所帮助。

2 个答案:

答案 0 :(得分: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文件中提取)

使用以下命令可以使用OpenSSL从PKCS#12文件中提取证书和密钥:

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

注意:如果您以这种方式(-nodes)提取私钥(在user.key.pem中),它将不受密码保护,因此您需要确保其他人无法读取此文件。我不认为OpenLDAP(甚至更少的Python绑定)让你以交互方式提示输入密码来解决这个问题,但我不确定。

答案 1 :(得分:0)

看起来ldaptor可以为您提供此功能。它建立在twisted之上,支持内置于twisted.internet.ssl模块的SSL。

请参阅:ldaptor.protocols.ldap.ldapclient.startTLS()