我想使用 .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/