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