У меня есть сертификат пользователя в Личном/Моем магазине Windows с экспортируемым закрытым ключом. Я пытаюсь экспортировать это в Python, чтобы использовать в качестве файлов .cer/.pem и секретных ключей в запросе API. Я пробовал в Интернете несколько различных решений, включающих библиотеки криптографии, win32api, win32crypt, ssl и OpenSSL. Кажется, ничего из того, что я пробовал, не помогает успешно экспортировать сертификат из хранилища напрямую в виде .cer/.pem и ключа или в виде .pfx, чтобы затем извлечь из него эти модули.
У меня есть рабочее решение, в котором я выполняю подпроцесс с помощью Powershell для использования CMDlet Export-PfxCertificate, а затем извлекаю общедоступные и частные байты последующего PFX с помощью стандартной библиотеки шифрования. Я надеюсь, что есть решение, которое избавит от необходимости выполнять подпроцесс в Powershell. Это мой текущий код, в котором я надеюсь заменить строки 3–11:
logging.info('Exporting the certificate from the cert store...')
transient_password = 'transient'
command = f'''$env:PSModulePath = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine');
$secret = ConvertTo-SecureString -String {transient_password} -Force -AsPlainText;
Export-PfxCertificate -Cert (Get-ChildItem -Path {CERT_PATH}) -FilePath caccpprod.pfx -Password $secret
'''
child = subprocess.run(['powershell', '-command', command], capture_output = True)
if (child.returncode != 0):
logging.error(f'Encountered an error exporting the Windows Store cert to a PFX: {child.stderr.decode("UTF-8")}')
return False, False
with open('caccpprod.pfx', 'rb') as pfx_file:
private_key, serial, chain = pkcs12.load_key_and_certificates(
pfx_file.read(),
transient_password.encode(),
default_backend()
)
with open(CER_FILE, 'wb') as cer_file:
cer_file.write(serial.public_bytes(serialization.Encoding.PEM))
with open(KEY_FILE, 'wb') as key_file:
key_file.write(private_key.private_bytes(
encoding = serialization.Encoding.PEM,
format = serialization.PrivateFormat.PKCS8,
encryption_algorithm = serialization.NoEncryption()
))
logging.info('Exported the certificate into .cer and .key files')
return CER_FILE, KEY_FILE
Подробнее здесь: https://stackoverflow.com/questions/787 ... -in-python