GitHub — uishnik/py-cryptopro: Обертка над утилитами cryptcp и certmgr, входящими в состав Крипто-Про CSP (для UNIX-платформ), позволяющая устанавливать и удалять сертификаты, создавать и проверять ЭЦП и т.д.

Github — uishnik/py-cryptopro: обертка над утилитами cryptcp и certmgr, входящими в состав крипто-про csp (для unix-платформ), позволяющая устанавливать и удалять сертификаты, создавать и проверять эцп и т.д.

Обертка над утилитами cryptcp и certmgr, входящими в состав Крипто-Про CSP (для UNIX-платформ), позволяющая устанавливать и удалять сертификаты, создавать и проверять ЭЦП и т.д.

Pycryptoprosdk,keyintegrity

Подскажите, каким образом привязать private.key к самоподписанному x509 сертификату, чтобы Cades смог подписывать контент?

from OpenSSL import crypto
from pycryptoprosdk import CryptoProSDK

CERT_FILE = "selfsigned.crt"
PRIVATE_KEY_FILE = "private.key"
PUBLIC_KEY_FILE = "public.key"
COMMON_NAME = 'Фамилия Имя Отчество'

def raw_cert(bytes_content):
    return ('n'.join(bytes_content.decode().split('n')[1:-2]) 'n').encode()

def create_self_signed_cert(common_name=COMMON_NAME, country='RU', state = 'Test state', city='Test city', organization='test organization', organizational_unit = 'test organizational unit'):
        # create a key pair
        k = crypto.PKey()
        k.generate_key(crypto.TYPE_RSA, 1024)
        # create a self-signed cert
        cert = crypto.X509()
        cert.get_subject().C = country
        cert.get_subject().ST = state
        cert.get_subject().L = city
        cert.get_subject().O = organization
        cert.get_subject().OU = organizational_unit
        cert.get_subject().CN = common_name
        cert.set_serial_number(1000)
        cert.gmtime_adj_notBefore(0)
        cert.gmtime_adj_notAfter(10*365*24*60*60)#10 years
        cert.set_issuer(cert.get_subject())
        cert.set_pubkey(k)
        cert.sign(k, 'sha1')

        open(CERT_FILE, "wb ").write(
            crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
        open(PRIVATE_KEY_FILE, "wb ").write(
            crypto.dump_privatekey(crypto.FILETYPE_PEM, k))
        open(PUBLIC_KEY_FILE, "wb ").write(
            crypto.dump_publickey(crypto.FILETYPE_PEM, k))

create_self_signed_cert() #creates selfsigned.crt, public.key, private.key
sdk = CryptoProSDK()
sdk.install_certificate('MY', raw_cert(open(CERT_FILE, 'rb').read()))
content = "test content"
cert = sdk.get_cert_by_subject('MY',COMMON_NAME)
signature = sdk.sign(content, cert.thumbprint, 'MY', detached=True)

"""
Exception has occurred: ValueError       (note: full exception trace is shown but execution is paused at: _run_module_as_main)
CadesSignMessage failed (error 0x8009200b).
"""

Есть ли возможность получить сам файл публичного сертификата, не в виде объекта, а в виде file-like object или конкретно в виде файла. Из примеров вижу, что сертификат можно положить в хранилище, или удалить, а просто получить публичную часть возможности нет

Hello I try to use on with cryptopro 5
and get error
In file included from pycryptoprosdk/libpycades.cpp:8:
pycryptoprosdk/libpycades.cpp: In function ‘char* GetHashOidByKeyOid(char*)’:
/opt/cprocsp/include/cpcsp/WinCryptEx.h:1164:29: warning: ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]
1164 | #define szOID_CP_GOST_R3411 «1.2.643.2.2.9»
| ^~~~~~~~~~~~~~~
pycryptoprosdk/libpycades.cpp:35:13: note: in expansion of macro ‘szOID_CP_GOST_R3411’
35 | return szOID_CP_GOST_R3411;
| ^~~~~~~~~~~~~~~~~~~
/opt/cprocsp/include/cpcsp/WinCryptEx.h:1165:36: warning: ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]
1165 | #define szOID_CP_GOST_R3411_12_256 «1.2.643.7.1.1.2.2»
| ^~~~~~~~~~~~~~~~~~~
pycryptoprosdk/libpycades.cpp:38:13: note: in expansion of macro ‘szOID_CP_GOST_R3411_12_256’
38 | return szOID_CP_GOST_R3411_12_256;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/cprocsp/include/cpcsp/WinCryptEx.h:1166:36: warning: ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]
1166 | #define szOID_CP_GOST_R3411_12_512 «1.2.643.7.1.1.2.3»
| ^~~~~~~~~~~~~~~~~~~
pycryptoprosdk/libpycades.cpp:41:13: note: in expansion of macro ‘szOID_CP_GOST_R3411_12_512’
41 | return szOID_CP_GOST_R3411_12_512;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
pycryptoprosdk/libpycades.cpp: At global scope:
pycryptoprosdk/libpycades.cpp:655:27: error: variable ‘PyModuleDef libpycades’ has initializer but incomplete type
655 | static struct PyModuleDef libpycades = {
| ^~~~~~~~~~
pycryptoprosdk/libpycades.cpp:656:5: error: ‘PyModuleDef_HEAD_INIT’ was not declared in this scope
656 | PyModuleDef_HEAD_INIT,
| ^~~~~~~~~~~~~~~~~~~~~
pycryptoprosdk/libpycades.cpp: In function ‘void PyInit_libpycades()’:
pycryptoprosdk/libpycades.cpp:666:9: error: ‘PyModule_Create’ was not declared in this scope; did you mean ‘PyModule_Check’?
666 | m = PyModule_Create(&libpycades);
| ^~~~~~~~~~~~~~~
| PyModule_Check
pycryptoprosdk/libpycades.cpp:668:43: warning: ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]
668 | CertDoesNotExist = PyErr_NewException(«libpycades.CertDoesNotExist», NULL, NULL);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pycryptoprosdk/libpycades.cpp:672:12: error: return-statement with a value, in function returning ‘void’ [-fpermissive]
672 | return m;
| ^
error: command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
how to fix this?

/opt/cprocsp/bin/amd64/certmgr -inst -store uroot -f certs/cert_cryptopro_test.cer 
Certmgr 1.0 (c) "CryptoPro",  2007-2022.
program for managing certificates, CRLs and stores

Install:
=============================================================================
1-------
Issuer              : [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject             : [email protected], C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Serial              : 0x2B6E3351FD6EB2AD48200203CB5BA141
SHA1 Hash           : 0x046255290b0eb1cdd1797d9ab8c81f699e3687f3
SubjKeyID           : 15317cb08d1ade66d7159c4952971724b9017a83
Signature Algorithm : ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm : ГОСТ Р 34.10-2001 (512 bits)
Not valid before    : 05/08/2022  13:44:24 UTC
Not valid after     : 05/08/2022  13:54:03 UTC
PrivateKey Link     : No                  
=============================================================================

[ErrorCode: 0x00000000]

А есть ли возможность как то подписывать с использованием сертификатов из хранилищей, на которые установлены пароли? Посмотрел исходники, но не увидел никакой возможности передачи пароля в качестве аргумента

В README.md есть кусок примера кода with open('certificate.cer'), 'rb') as f:. Тут лишняя закрывающая скобка.
И в Dockerfile используется /opt/cprocsp/bin/amd64/certmgr -inst -store uca -f /certs/kazna.cer, хотя данны сертификат отсутвует в certs/. Где его можно получить?

Оцените статью
ЭЦП64
Добавить комментарий