Запросите LDAP для атрибута userCertificate, используя python-ldap

Я пытаюсь запросить атрибут «userCertificate; двоичный», используя библиотеку python-ldap. Цель состоит в том, чтобы аутентифицировать пользователя, используя его собственный сертификат. Мой код выглядит так:

# 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.

Вопросы. Как можно сформулировать такой запрос?

Спасибо.

Редактировать: я нашел обходной путь для этой проблемы, но проблема все еще не устранена, я проведу дополнительные исследования для фактической проблемы.


person karim140995    schedule 20.12.2019    source источник
comment
Помогает ли это? Возможно, вам придется экранировать str(certificate), убедившись, что значение фильтра соответствует тому, что описано в инструментах . ietf.org/html/rfc4523#section-2.5   -  person EricLavault    schedule 23.12.2019
comment
Я попробую это, но я действительно не знаю, что именно нужно экранировать, учитывая, что формат моего сертификата не utf-8, я все же нашел способ обойти эту проблему.   -  person karim140995    schedule 25.12.2019
comment
Вы можете принять свой ответ, если он решил проблему, учитывая ваш фактический вопрос, если нет (просто обходной путь), то вы можете отредактировать свой пост, чтобы запросить дальнейшее исследование фактической проблемы. Предоставленный вами обходной путь полезен (+1), но может не решить проблему, как она задана. Как новый пользователь, знайте, что это важно учитывать для других, которые могут столкнуться с той же проблемой.   -  person EricLavault    schedule 25.12.2019


Ответы (1)


Мне удалось обойти проблему, выполнив поиск атрибута записи «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
person karim140995    schedule 25.12.2019