【问题标题】:How to connect to a LDAP server using a p12 certificate如何使用 p12 证书连接到 LDAP 服务器
【发布时间】:2011-01-12 16:42:34
【问题描述】:

我想使用 .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 格式)的解决方案,它也会对我有所帮助。

【问题讨论】:

    标签: python ldap certificate pkcs#12


    【解决方案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 绑定)让您以交互方式提示输入密码来解决这个问题,但我不确定。

    【讨论】:

      【解决方案2】:

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

      见:ldaptor.protocols.ldap.ldapclient.startTLS()

      【讨论】:

        猜你喜欢
        • 2013-07-13
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 2014-08-13
        • 2015-11-06
        • 2013-03-26
        相关资源
        最近更新 更多