问题描述
我的证书存在于 /etc/certs/mycer.pem 文件中,我可以使用以下代码通过 ldap 进行身份验证:
import ldap
import os
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_DEMAND)
ls = ldap.initialize('ldaps://<ip>:10636')
ls.set_option(ldap.OPT_REFERRALS,0)
ls.set_option(ldap.OPT_PROTOCOL_VERSION,3)
ls.set_option(ldap.OPT_X_TLS_CACERTFILE,"/etc/certs/mycer.pem") # line 7
ls.set_option(ldap.OPT_X_TLS_NEWCTX,0)
ls.simple_bind_s('uid=admin,ou=system','secret')
但是如果我将第 7 行中的 OPT_X_TLS_CACERTFILE
更改为 OPT_X_TLS_CACERTDIR
为:
ls.set_option(ldap.OPT_X_TLS_CACERTDIR,"/etc/certs/")
>>> ls.simple_bind_s('uid=admin,'secret')
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 445,in simple_bind_s
msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 439,in simple_bind
return self._ldap_call(self._l.simple_bind,who,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls))
File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 331,in _ldap_call
reraise(exc_type,exc_value,exc_traceback)
File "/usr/local/lib/python3.6/dist-packages/ldap/compat.py",line 44,in reraise
raise exc_value
File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 315,in _ldap_call
result = func(*args,**kwargs)
ldap.SERVER_DOWN: {'desc': "Can't contact LDAP server",'info': '(unkNown error code)'}
目录中只有一个文件。如果这不是正确的方法,python-ldap 如何使用多个证书文件。
解决方法
据我所知,python 将使用 OpenSSL 并随后扫描 OPT_X_TLS_CACERTDIR
目录以查找名为 *.crt
的证书文件。
但我终其一生都找不到那种智慧的来源。
编辑:
我找到了一个包含两者的旧脚本:
conn.set_option(ldap.OPT_X_TLS_CACERTFILE,"")
conn.set_option(ldap.OPT_X_TLS_CACERTDIR,"/etc/ssl/cacerts")
莫非这个空的 OPT_X_TLS_CACERTFILE
设置是必需的?