Получение python приложения для доступа к сертификату, хранящемуся в windows диспетчере сертификатов - PullRequest
1 голос
/ 03 марта 2020

У меня API.crt хранится в windows диспетчере сертификатов -> Доверенные Root Центры сертификации. В списке отображается имя сертификата как 'localhost'

Когда я запускаю код ниже, он работает, когда я указываю путь к сертификату в функции load_verify_locations().

Но это не работает, когда я получаю сертификат от windows диспетчера сертификатов и предоставляю действительный сертификат. Пожалуйста, кто-нибудь может помочь мне в этом.

import wincertstore
import ssl
for storename in ("CA", "ROOT"):
    with wincertstore.CertSystemStore(storename) as store:
        for cert in store.itercerts(usage=wincertstore.SERVER_AUTH):
            if cert.get_name() == 'localhost': #name of cert
                mycert = cert.get_pem()


context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations("C:/API.crt") ##Works if certificate is stored locally
context.load_verify_locations(mycert) ## Does not Works if certificate is passed.

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    context.load_verify_locations(mycert) ## Does not Works if certificate is passed.
FileNotFoundError: [Errno 2] No such file or directory

1 Ответ

0 голосов
/ 03 марта 2020

Метод SSLContext.load_verify_locations() принимает три ключевых аргумента:

  • cafile

    путь к файлу сцепленных сертификатов CA в формате PEM

  • capath

    путь к каталогу, содержащему несколько сертификатов CA в формате PEM

  • cadata

    или ASCII-строка из одного или нескольких сертификатов в кодировке PEM или байтовоподобный объект сертификатов в кодировке DER

Из-за mycert = cert.get_pem(), mycert - это строка ASCII PEM этого сертификата, а не путь к сертификату.

В обоих вызовах вы передаете параметр как позиционный, поэтому он присваивается первому ключевому аргументу (cafile). В первом вызове ваш аргумент - это действительно путь к файлу, поэтому он работает как положено. Во втором случае это не путь к файлу, поэтому вызов завершается неудачно с FileNotFoundError.

Если вы измените второй вызов на context.load_verify_locations(cdata=mycert), чтобы указать, что ваш аргумент является строкой PEM, я подозреваю, что он будет работать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...