Skip to main content
 首页 » 编程设计

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

2025年05月04日13tintown

我想使用 .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,你可以使用 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 文件中提取证书和 key :

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 中),它将不受密码保护,因此您'll 需要确保此文件不能被任何其他人读取。我认为 OpenLDAP(更不用说它的 Python 绑定(bind))不会让您以交互方式提示输入密码来解决该问题,但我不确定。