Пройти проверку сертификата на сайте с помощью python (КриптоПро)

Мне нужно пройти проверку сертификата на сайте www.atsenergo.ru/КОММЕРЧЕСКИЙУЧЕТ/ДанныеАИИС.

У меня есть файл формата .pfx (КриптоПро), как с помощью python,я могу пройти сертификацию ?

import contextlib
import OpenSSL.crypto
import os
import requests
import ssl
import tempfile

@contextlib.contextmanager
def pfx_to_pem(pfx_path, pfx_password):
    ''' Decrypts the .pfx file to be used with requests. '''
    with tempfile.NamedTemporaryFile(suffix='.pem', delete=False) as t_pem:
        t_pem.close() 
        f_pem = open(t_pem.name, 'wb')
        pfx = open(pfx_path, 'rb').read()
        p12 = OpenSSL.crypto.load_pkcs12(pfx, pfx_password)
        f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey()))
        f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12.get_certificate()))
        ca = p12.get_ca_certificates()
        if ca is not None:
            for cert in ca:
                f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert))
        f_pem.close()
        yield t_pem.name


url = 'https://www.atsenergo.ru/%D0%9A%D0%9E%D0%9C%D0%9C%D0%95%D0%A0%D0%A7%D0%95%D0%A1%D0%9A%D0%98%D0%99%D0%A3%D0%A7%D0%95%D0%A2/%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%D0%90%D0%98%D0%98%D0%A1.'
with pfx_to_pem('xxxx.pfx', 'xxxxxxxxx') as cert:
     requests.post(url, cert=cert, verify=False)

Выдаёт ошибку

 Error: [('digital envelope routines', 'EVP_PBE_CipherInit', 'unknown pbe algorithm'), ('PKCS12 routines', 'PKCS12_pbe_crypt', 'pkcs12 algor cipherinit error'), ('PKCS12 routines', 'PKCS12_item_decrypt_d2i', 'pkcs12 pbe crypt error'), ('PKCS12 routines', 'PKCS12_parse', 'parse error')]

Пробовал другой код, выдаёт такую же ошибку. Как я понял, проблема в сертификате, нужно поменять его на другой формат или сделать что=то еще.

import os
from OpenSSL import crypto

class PKCS12Manager():

    def __init__(self, p12file, passphrase):
        self.p12file = p12file
        self.unlock = passphrase
        self.webservices_dir = ''
        self.keyfile = ''
        self.certfile = ''

        # Get filename without extension
        ext = os.path.splitext(p12file)
        self.filebasename = os.path.basename(ext[0])

        self.createPrivateCertStore()
        self.p12topem()

    def getKey(self):
        return self.keyfile

    def getCert(self):
        return self.certfile

    def createPrivateCertStore(self):
        home = os.path.expanduser('~')
        webservices_dir = os.path.join(home, '.webservices')
        if not os.path.exists(webservices_dir):
            os.mkdir(webservices_dir)
        os.chmod(webservices_dir, 0o700)
        self.webservices_dir = webservices_dir

    def p12topem(self):
        p12 = crypto.load_pkcs12(open(self.p12file, 'rb').read(), bytes(self.unlock, 'utf-8'))

        # PEM formatted private key
        key = crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

        self.keyfile = os.path.join(self.webservices_dir, self.filebasename + ".key.pem")
        open(self.keyfile, 'a').close()
        os.chmod(self.keyfile, 0o600)
        with open(self.keyfile, 'wb') as f:
            f.write(key)


        # PEM formatted certificate
        cert = crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

        self.certfile = os.path.join(self.webservices_dir, self.filebasename + ".crt.pem")
        open(self.certfile, 'a').close()
        os.chmod(self.certfile, 0o644)
        with open(self.certfile, 'wb') as f:
            f.write(cert)


from requests import Session
from zeep import Client
from zeep.transports import Transport


pkcs12 = PKCS12Manager('xxxxx.pfx', 'xxxxxxx')
session = Session()
session.cert = (pkcs12.getCert(), pkcs12.getKey())

transport = Transport(session=session)
client = Client('https://www.atsenergo.ru/%D0%9A%D0%9E%D0%9C%D0%9C%D0%95%D0%A0%D0%A7%D0%95%D0%A1%D0%9A%D0%98%D0%99%D0%A3%D0%A7%D0%95%D0%A2/%D0%94%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%D0%90%D0%98%D0%98%D0%A1.', transport=transport)

Выдаёт ошибку

Error: [('digital envelope routines', 'EVP_PBE_CipherInit', 'unknown pbe algorithm'), ('PKCS12 routines', 'PKCS12_pbe_crypt', 'pkcs12 algor cipherinit error'), ('PKCS12 routines', 'PKCS12_item_decrypt_d2i', 'pkcs12 pbe crypt error'), ('PKCS12 routines', 'PKCS12_parse', 'parse error')]

Ответы (0 шт):