首页 > 解决方案 > 使用 python-ldap 在 LDAP 中查询 userCertificate 属性

问题描述

我正在尝试使用 python-ldap 库查询“userCertificate;binary”属性。目的是使用他自己的证书对用户进行身份验证。我的代码如下所示:

# Search parameters
searchScope = ldap.SCOPE_SUBTREE
searchFilter = "userCertificate;binary="+str(certificate)
retrieveAttributes = None

#Searching LDAP entry
result  = con.search_s(ldap_base,searchScope,searchFilter,retrieveAttributes)

这会从 ldap 返回“错误搜索过滤器”异常。

问题:如何制定这样的查询?

谢谢你。

编辑:我找到了解决此问题的方法,但问题仍然存在,我将针对实际问题进行更多研究。

标签: pythonldappython-ldap

解决方案


我设法通过搜索条目“cn”属性而不是证书然后将检索到的 DER 证书转换为 PEM 格式并将其与请求 PEM 证书进行比较来绕过问题,这样非 utf-8 不会有任何问题DER编码。我的代码看起来像这样。

# Reading certification request
crt_request = request.form["certificate"]
crt_request = str.encode(crt_request)
# Search parameters
cn = request.form["cn"]
searchScope = ldap.SCOPE_SUBTREE
searchFilter = "cn=*"+cn+"*"
retrieveAttributes = None

#Searching LDAP entry
result  = con.search_s(ldap_base,searchScope,searchFilter,retrieveAttributes)
if( not result) :
    return jsonify("Entry not found"),401
#Getting DER certificate and converting it to PEM
der_cert = result[0][1]
der_cert = der_cert.get("userCertificate;binary")[0]
try : 
    certificate = x509.load_der_x509_certificate(der_cert,default_backend())
    crt = certificate.public_bytes(serialization.Encoding.PEM)
except ldap.LDAPError:
    return jsonify("Bad certification format"),401
if(crt == crt_request ) :
    return jsonify(crt),200
else :
    return jsonify("Unvalid certificate"),401

推荐阅读