Как установить сертификат в доверенные корневые сертификаты с помощью python?

Мне нужно написать код Python, который устанавливает сертификат в доверенные корневые сертификаты моей машины (Windows) или локального пользователя. Я попробовал приведенный ниже код. Код работает без ошибок, но похоже, что хранилище не является доверенным корнем Windows. Я также прочитал документацию по wincert и win32crypt модулю python, похоже, ничего не помогает.

import OpenSSL.crypto

cert = OpenSSL.crypto.load_certificate(
    OpenSSL.crypto.FILETYPE_PEM, 
    open('certFile.crt').read()
)

store = OpenSSL.crypto.X509Store()
if not store.add_cert(cert):
    print('Success')

Изменить: мне нужно сделать что-то подобное, упомянутое здесь, но с использованием python.

Редактировать 2: я также попробовал метод ниже (не уверен, что он выполнит намеченную работу):

import win32crypt
import sys

CERT_STORE_PROV_SYSTEM = 0x0000000A
CERT_STORE_OPEN_EXISTING_FLAG = 0x00004000
CRYPT_STRING_BASE64HEADER = 0x00000000

def main():

    store = win32crypt.CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, None, CERT_SYSTEM_STORE_LOCAL_MACHINE|CERT_STORE_OPEN_EXISTING_FLAG, "ROOT")
    cert_str = open('D:\\Certificates\\certFile.crt').read()
    cert_byte = win32crypt.CryptStringToBinary(cert_str, CRYPT_STRING_BASE64HEADER)[0]
    win32crypt.CertAddSerializedElementToStore(store,cert_byte,1,2,0)

if __name__ == "__main__":

    main()
    print('done')

но я получаю следующую ошибку:

win32crypt.CertAddSerializedElementToStore(store,cert_byte,1,2,0)
pywintypes.error: (-2146885629, 'CertAddSerializedElementToStore', 'An error occurred while reading or writing to a file.')

person prasanth_bazz    schedule 19.05.2020    source источник


Ответы (1)


Этот фрагмент кода работал для меня. Разместите это здесь на всякий случай, если это кому-то поможет.

#Flag variables
CERT_STORE_PROV_SYSTEM = 0x0000000A
CERT_STORE_OPEN_EXISTING_FLAG = 0x00004000
CRYPT_STRING_BASE64HEADER = 0x00000000
CERT_SYSTEM_STORE_CURRENT_USER_ACCOUNT = 1<<16
X509_ASN_ENCODING = 0x00000001
CERT_STORE_ADD_REPLACE_EXISTING = 3
CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001

#replace with your certificate file path
crtPath = "D:\\certificates\\cert_file.crt"

with open(crtPath,'r') as f:
        cert_str = f.read()

cert_byte = win32crypt.CryptStringToBinary(cert_str, CRYPT_STRING_BASE64HEADER)[0]
store = win32crypt.CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, None, CERT_SYSTEM_STORE_CURRENT_USER_ACCOUNT|CERT_STORE_OPEN_EXISTING_FLAG, "ROOT")
    
try:
   store.CertAddEncodedCertificateToStore(X509_ASN_ENCODING, cert_byte, CERT_STORE_ADD_REPLACE_EXISTING)
finally:
    store.CertCloseStore(CERT_CLOSE_STORE_FORCE_FLAG)

К вашему сведению, модуль win32crypt доступен с библиотекой pywin32. Вы можете установить его, выполнив эту команду.

пип установить pywin32

person prasanth_bazz    schedule 11.08.2020