Найдите json/dict сертификата клиента из запроса HTTPS

#python #ssl #request #openssl #certificate

Вопрос:

У меня есть сертификат клиента — сертификат сервера для конечной точки колбы, которую я создаю. В настоящее время HTTPS-запросы могут отправляться, и я могу распечатать сведения о сертификате клиента на стороне сервера следующим образом:

 @app.route('/predict', methods=['POST'])
def predict():
    res = "hi"
    status = False

    if request.url.startswith('https://'):
        client_cert = request.headers["CLIENT_CERT"]
        res = client_cert["subject"]
        print(client_cert)
 

Он выводит информацию о сертификате клиента, который поступает из запроса:

 "{'subject': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', '*.domainname.com'),)), 'issuer': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', 'SAMPLE CA'),)), 'version': 1, 'serialNumber': '01', 'notBefore': 'Aug 12 07:21:25 2021 GMT', 'notAfter': 'Aug 12 07:21:25 2022 GMT'}"
 

Я ищу, чтобы получить commonName запись в приведенной выше строке для дальнейшей проверки, так как я только хочу разрешить commonName , чтобы она была в определенном формате, который я ожидаю.

Как вы можете видеть, получение сертификата клиента из заголовков запроса дает сертификат в виде строки. Поскольку это не строка правильного json, я не могу использовать json.loads ее для анализа строки в словаре. есть ли какой-либо хороший способ проанализировать эту строку, чтобы я мог получить commonName значение, или есть какой-либо другой хороший способ получить доступ к сертификату клиента запроса?

Спасибо!

Ответ №1:

Формат ответа, по-видимому, четко определен. В этом случае это позволит достичь цели операции. Несомненно, есть огонь, который сделает свое дело, но это просто и эффективно:-

 def getCommonNames(s):
    rv = []
    offset = 0
    try:
        while True:
            i = s.index('commonName', offset)
            offset = i   14
            j = s.index("'", offset)
            rv.append(s[offset:j])
    except Exception:
        pass
    return rv


S = "{'subject': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', '*.domainname.com'),)), 'issuer': ((('countryName', 'DE'),), (('stateOrProvinceName', 'BW'),), (('localityName', 'Walldorf'),), (('organizationName', 'MYCOMPANY'),), (('organizationalUnitName', 'MYDEPARTMENT'),), (('commonName', 'SAMPLE CA'),)), 'version': 1, 'serialNumber': '01', 'notBefore': 'Aug 12 07:21:25 2021 GMT', 'notAfter': 'Aug 12 07:21:25 2022 GMT'}"
print(getCommonNames(S))