Giter VIP home page Giter VIP logo

pycryptoprosdk's Introduction

pycryptoprosdk

Библиотека для работы с Cryptopro CSP в python

Системные требования

  • Python >= 3.5
  • КриптоПро CSP >= 4

Установка

  • Установить КриптоПро CSP.
  • Установить пакеты lsb-cprocsp-devel-.noarch.rpm и cprocsp-pki-amd64-cades.rpm из состава КриптоПро ЭЦП SDK.
  • При необходимости, создать симлинк:
ln -s /opt/cprocsp/lib/amd64/libcades.so.2.0.0 /opt/cprocsp/lib/amd64/libcades.so

Пример установки пакетов можно посмотреть в pycryptoprosdk/compose/Dockerfile.

  • Установить pycryptoprosdk:
pip install pycryptoprosdk

Примеры использования

>>> from pycryptoprosdk import CryptoProSDK


>>> sdk = CryptoProSDK()


# Создание и проверка отсоединенной подписи:
>>> content = 'test content'
>>> cert = sdk.get_cert_by_subject('MY', 'Ivan')
>>> signature = sdk.sign(content, cert.thumbprint, 'MY', detached=True)
>>> result = sdk.verify_detached(content, signature)

# статус проверки:
>>> result.verification_status
0

# 0: Успешная проверка подписи.
# 1: Отсутствуют или имеют неправильный формат атрибуты со ссылками и значениями доказательств подлинности.
# 2: Сертификат, на ключе которого было подписано сообщение, не найден.
# 3: В сообщении не найден действительный штамп времени на подпись.
# 4: Значения ссылок на доказательства подлинности и сами доказательства, вложенные в сообщение, не соответствуют друг другу.
# 5: Не удалось построить цепочку для сертификата, на ключе которого подписано сообщение.
# 6: Ошибка проверки конечного сертификата на отзыв.
# 7: Ошибка проверки сертификата цепочки на отзыв.
# 8: Сообщение содержит неверную подпись.
# 9: В сообщении не найден действительный штамп времени на доказательства подлинности подписи.
# 10: Значение подписанного атрибута content-type не совпадает со значением, указанным в поле encapContentInfo.eContentType.

# сертификат подписанта:
>>> result.cert.as_dict()
{'CN': 'Ivan'}


# создание хэша файла алгоритмом ГОСТ Р 34.11-94:
>>> sdk.create_hash('some text', alg='CALG_GR3411')
'046255290b0eb1cdd1797d9ab8c81f699e3687f3'


# поиск сертификата в хранилище MY по отпечатку:
>>> cert = sdk.get_cert_by_thumbprint('MY', '046255290b0eb1cdd1797d9ab8c81f699e3687f3')


# поиск сертификата по имени:
>>> cert = sdk.get_cert_by_subject('MY', 'CRYPTO-PRO Test Center 2')


# установка сертификата в хранилище MY:
>>> with open('certificate.cer', 'rb') as f:
>>>     cert_content = f.read()
>>> sdk.install_certificate('MY', cert_content)


# удаление сертификата из хранилища MY по отпечатку:
>>> sdk.delete_certificate('MY', '9e78a331020e528c046ffd57704a21b7d2241cb3')


# извлечение сертификата подписанта из подписи:
>>> with open('signature.sig', 'rb') as f:
>>>     signature_content = f.read()
>>> cert = sdk.get_signer_cert_from_signature(signature_content)

pycryptoprosdk's People

Contributors

uishnik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

pycryptoprosdk's Issues

Сертификат certs/cert_cryptopro_test.cer истёк 05/08/2019

/opt/cprocsp/bin/amd64/certmgr -inst -store uroot -f certs/cert_cryptopro_test.cer 
Certmgr 1.0 (c) "CryptoPro",  2007-2010.
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/2014  13:44:24 UTC
Not valid after     : 05/08/2019  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/. Где его можно получить?

trouble with install

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?

Can't create cert content

Спасибо за труд.

libpycades.install_certificate('MY', cert_content)
возвращает
Exception: Can't create cert context.

cert_content
b'-----BEGIN CERTIFICATE-----\nMIICrjCCAhcCAgPoMA0GCSqGSIb3DQEBBQUAMIGeMQswCQYDVQQGEwJSVTEPMA0G\nA1UECAwGTW9zY293MQ8wDQYDVQQHDAZNb3Njb3cxFzAVBgNVBAoMDk5la3Jhc292\na2EgbGliMRcwFQYDVQQLDA5OZWtyYXNvdmthIGxpYjE7MDkGA1UEAwwy0J/QvtC3\n0LTQvdGP0LrQvtCyINCk0LjQu9C40L/QvyDQodC10YDQs9C10LXQstC40YcwHhcN\nMjEwMTMxMDEwNjA0WhcNMzEwMTI5MDEwNjA0WjCBnjELMAkGA1UEBhMCUlUxDzAN\nBgNVBAgMBk1vc2NvdzEPMA0GA1UEBwwGTW9zY293MRcwFQYDVQQKDA5OZWtyYXNv\ndmthIGxpYjEXMBUGA1UECwwOTmVrcmFzb3ZrYSBsaWIxOzA5BgNVBAMMMtCf0L7Q\nt9C00L3Rj9C60L7QsiDQpNC40LvQuNC/0L8g0KHQtdGA0LPQtdC10LLQuNGHMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD0XfCZ8M6S/yKFg06NQpANxtYxOuzH\n9L3L47XB2A16DEUJaFfWPLaQK+hNNb1UjxWzMib754b4FVvvZFVulmhohNySwem4\nTifUsKjm0KQ9iAnHEI62QQ3Lwn1fpL6CpYOUKuKfgMsqdq2rTa1dHNRLOgohvez1\nY7o2hZC7PqZL8QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAOwJAlyYdU1eYOdysWKj\nm73lxo/bEme8YPpa0AdqHT87YQdQoYXkVAmTk8VYrc0p1HGigVTnFrZKAGfzuvPN\nTTIH9wsf+xiifLGjal83j9bE6vSKvBqzzEHa6wXtgqI4DKHqicQAw2xEuVxGLnZ5\nejwuOSQsLZRF93YBbtVCRKhX\n-----END CERTIFICATE-----\n'

Подскажите, в какую сторону копать?

Подпись с паролем

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

Получение публичного сертификата

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

CadesSignMessage failed (error 0x8009200b).

Подскажите, каким образом привязать 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).
"""

Ошибка при сборке libpycades.cpp

Спасибо за проделанный труд!

Пытаюсь создать контейнер с целью подписания строк (авторизация crpt Честный знак) ГОСТ 2012 сертификатом.
При запуске получаю предупреждения, и больше ничего.

running build_ext
building 'pycryptoprosdk.libpycades' extension
creating build
creating build/temp.linux-x86_64-3.8
creating build/temp.linux-x86_64-3.8/pycryptoprosdk
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DUNIX=1 -DHAVE_LIMITS_H=1 -DHAVE_STDINT_H=1 -DSIZEOF_VOID_P=8 -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/pki -I/usr/local/include/python3.8 -c pycryptoprosdk/libpycades.cpp -o build/temp.linux-x86_64-3.8/pycryptoprosdk/libpycades.o
In file included from /opt/cprocsp/include/cpcsp/CSP_WinCrypt.h:25,
                 from /opt/cprocsp/include/cpcsp/WinCryptEx.h:34,
                 from pycryptoprosdk/libpycades.cpp:8:
/opt/cprocsp/include/cpcsp/CSP_WinDef.h:484:152: note: #pragma message: Your application will require at least CryptoPro CSP 4.0 R3. You can use LEGACY_FORMAT_MESSAGE_IMPL to support older versions.
 #      pragma message ("Your application will require at least CryptoPro CSP 4.0 R3. You can use LEGACY_FORMAT_MESSAGE_IMPL to support older versions.")
                                                                                                                                                        ^
In file included from pycryptoprosdk/libpycades.cpp:8:
pycryptoprosdk/libpycades.cpp: In function ‘char* GetHashOidByKeyOid(char*)’:
/opt/cprocsp/include/cpcsp/WinCryptEx.h:925:29: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
 #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’
      return szOID_CP_GOST_R3411;
             ^~~~~~~~~~~~~~~~~~~
/opt/cprocsp/include/cpcsp/WinCryptEx.h:926:36: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
 #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’
      return szOID_CP_GOST_R3411_12_256;
             ^~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/cprocsp/include/cpcsp/WinCryptEx.h:927:36: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
 #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’
      return szOID_CP_GOST_R3411_12_512;
             ^~~~~~~~~~~~~~~~~~~~~~~~~~
g++ -pthread -shared build/temp.linux-x86_64-3.8/pycryptoprosdk/libpycades.o -L/usr/local/lib -o /build/pycryptoprosdk/pycryptoprosdk/libpycades.cpython-38-x86_64-linux-gnu.so -L/opt/cprocsp/lib/amd64 -lcapi20 -lcapi10 -lcades -lrdrsup

Собирал под текущую версию 4.0.9963-5
Dockerfile целиком (python-3.8, без lsb-core, lsb-base -- не найдены)

FROM python:3.8

ENV PYTHONUNBUFFERED 1
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    g++ \
    alien \
    mc \
    nano \
    python-pip \
    python-mysqldb

COPY ./compose/cpcsp /cpcsp
RUN bash /cpcsp/install.sh

RUN cd /cpcsp && alien -kci lsb-cprocsp-devel-4.0.9963-5.noarch.rpm cprocsp-pki-2.0.0-amd64-cades.rpm
RUN ln -s /opt/cprocsp/lib/amd64/libcades.so.2.0.0 /opt/cprocsp/lib/amd64/libcades.so

COPY ./compose/certs /certs
RUN /opt/cprocsp/bin/amd64/certmgr -inst -store uca -f /certs/cert_cryptopro_test.cer \
    && /opt/cprocsp/bin/amd64/certmgr -inst -store uca -f /certs/guc.cer \
    && /opt/cprocsp/sbin/amd64/cpconfig -ini '\config\Parameters' -add bool Rfc6125_NotStrict_ServerName_Check true

COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

COPY ./ /build/pycryptoprosdk
WORKDIR /build/pycryptoprosdk

#RUN cd /build/pycryptoprosdk && python setup.py install

ENV TERM xterm
ENV TZ=Europe/Moscow

COPY ./compose/docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh

ENTRYPOINT ["/docker-entrypoint.sh"]

Выбор OID

По какому признаку происходит выбор хэш алгоритма при подписании ? Я посмотрел по исходникам, но мой уровень с++ не на столь высоком уровне. Я как понял алгоритм достается из сертификата, это правильно ? Могу ли я как то повлиять на это ?

И еще вопрос поводу типа провайдера при создании хэша. Правильно ли я понимаю что вместо передачи
-provtype используется передача аргумента alg у метода create_hash и по умолчанию будет использован ГОСТ Р 34.11-94 соответствующий 75 типу провайдера ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.