ldap.OPT_X_TLS_CACERTDIR 无法处理目录中的证书文件

问题描述

我的证书存在于 /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 设置是必需的?