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

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

最佳答案

如果你使用 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))不会让您以交互方式提示输入密码来解决该问题,但我不确定。

关于python - 如何使用 p12 证书连接到 LDAP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2193362/

相关文章:

java - 使用 Java 的 LDAP 身份验证

java - 我可以使用像 ApacheDS 这样的 LDAP 服务器作为桌面应用程序的持久性解决方案吗?

iis - 启用证书身份验证时获取 401.2

wcf - WCF 服务中的自定义证书验证

ssl - nginx 和 ssl 证书

python - 设置PythonHome为/var/www/virtualenvs/myenv/ImportError : No module named site

python - 使用 Openpyxl 更新 Excel 模板导致图表中不再显示数据表

Python select with _mysql 模块没有错误

Spring LdapTemplate方法来测试条目是否存在?

python - 与 NumPy 实例调用的相等性比较 `__bool__`