xp
python 3.4
openssl который внутри пайтона OpenSSL 1.0.1l 15 Jan 2015
А на хр стоит openssl 1.1.0j
Крипто про CSP 4.0.9975 Версия ядра СКЗИ 4.0.9021 КС1

Добрый день. Кто нибудь работает в python в связке с крипто про? Точнее есть кто делает защищенные соединения по гостовскому шифрованию на windows? Хочу достучать до сайта мдлп честного знака по api защищенному соединению и пока не удается. Или может нужна библиотека для связи с крипто про типа cryptoprosdk но не могу установить.

Вот пример ошибки:
self._sslobj.do_handshake()
ssl.SSLError: sslv3 alert handshake failure (_ssl.c:600)

Да понимаю что который на компе openssl стоит и там нет гостовского шифрования.В конфиге прописывал типа путь к библиотеке gostengy.dll версия 4.0.410.54443 скачанный с инета.После запуска openssl проверил cliphers не вижу гостовского шифрования.


Примерно такой код.
 def http(url, secure=443, encoding='utf-8'):
    components = urllib.parse.urlsplit(url)
    print(components)
    path = '%s' % components.path if components.path else '/'
    HTTPS = (components.scheme == 'https')
    addr = components.hostname
    port = secure if HTTPS else 80
    CRLF = '\r\n\r\n'
    print(HTTPS)
    print(addr)
    print(port)
    
    Page = namedtuple('Page', ('code', 'headers', 'body'))
    print(Page)    
 
    def handshake(sock):
        # this will trigger the handshake
        # if sock is already connected
        new_sock = ssl.wrap_socket(sock,
                ciphers="GOST2012-GOST8912-GOST8912:HIGH",
                ssl_version=ssl.PROTOCOL_TLSv1,
                cert_reqs=ssl.CERT_REQUIRED, # I will verify your certificate
                ca_certs=certifi.where(), # using a list of trusted CA's certificates
                server_side=False,
                do_handshake_on_connect = True,
                certfile= None,
                keyfile= None
                )
        return new_sock
    
    def make_header():
        headers = [
            'Content-Type:application/json',
            'Accept:application/json',
            'Authorization: token %s' % token,
            'POST %s HTTP/1.1' % (path),
            'Host: %s' % addr,
            'Charset: %s' % encoding
        ]
        print(headers)
        header = '\n'.join(headers)
        header += CRLF
        return bytes(header, encoding=encoding)
    
    def parse_response(resp):
        '''
        resp
            http.client.HTTPResponse, not closed
        '''
        resp.begin()
        code = resp.getcode()
        # assume status 200
        headers = dict(resp.getheaders())
        def get_charset():
            ctt_type = headers.get('Content-Type')
            return cgi.parse_header(ctt_type)[1].get('charset', encoding)
        body = resp.read()
        body = str(body, encoding=get_charset())
        return Page(code, headers, body)
    
    def request(header):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print(addr)
        HOST = socket.getaddrinfo(addr, 443)[0][4][0]
        print(HOST)
        sock.connect((addr, port))
        try:
            if HTTPS: sock = handshake(sock)
            sock.sendall(header)
            # receive it
            resp = HTTPResponse(sock)
            return parse_response(resp)
        finally:
            sock.shutdown(1)
            sock.close()    
    
    return request(make_header())
 
url = "https://api.mdlp.crpt.ru/api/v1/reestr/sgtin/sgtins-by-list"
rrr=http(url)
print(rrr)