Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Павел Геннадьевич  
#1 Оставлено : 17 июня 2024 г. 12:35:39(UTC)
Павел Геннадьевич

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.06.2024(UTC)
Сообщений: 5

Добрый день!

Установил либу pycades для Python, пытаюсь загрузить сертификат и подписать им XML.
Ошибки, с которыми я столкнулся:

1. При попытке присвоения объекту signer сертификата из хранилища, падает ошибка `TypeError: argument must be pycades.Certificate, not PycadesModuleWrapper`.

Пример кода:
Код:
from pycades import pycades

store = pycades.Store()
store.Open(pycades.CAPICOM_CURRENT_USER_STORE, pycades.CAPICOM_ROOT_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
cert = pycades.Certificate()

with open('certificate.cer', 'rb') as cert:
    cert.Import(cert.read())

store.Add(cert)
assert (store.Certificate.Count != 0), 'Certificates with private key not found'

signer = pycades.Signer()
signer.Certificate = store.Certificates.Item(7)  #на этом этапе падаем с ошибкой



Полный текст ошибки:

Код:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.12/site-packages/pycades/__init__.py", line 70, in __setattr__
    setattr(self._original_instance, name, value)
TypeError: argument must be pycades.Certificate, not PycadesModuleWrapper


Почему pycades не пропускает сертификаты из оболочки Python?



2. При попытке открыть пользовательское хранилище "My" получаю ошибку:
Код:
Exception: The system cannot find the file specified. (0x80070002)


Пример кода:
Код:

from pycades import pycades

store = pycades.Store()
store.Open(pycades.CAPICOM_CURRENT_USER_STORE, pycades.CAPICOM_ROOT_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)  # падаем на этом шаге


Полный текст ошибки:
Код:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.12/site-packages/pycades/__init__.py", line 44, in __call__
    value = self._original_instance(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Exception: The system cannot find the file specified. (0x80070002)


При этом, если я просматриваю хранилище в контейнере с помощью
Код:
/opt/cprocsp/bin/amd64/certmgr -enumstores all_locations
, то оно пустое. А если я открываю его через pycades, то вижу сразу 7 предустановленных сертификатов.

При просмотре хранилища в контейнере:

Код:
CurrentUser:
LocalMachine:
  cryptoprotrustedstore
    Default
  root
    Default
  ca
    Default
  my
    Default


При открытии хранилища из pycades:
Код:

from pycades import pycades

store = pycades.Store()
store.Open(pycades.CAPICOM_CURRENT_USER_STORE, pycades.CAPICOM_ROOT_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)

store.Certificates.Count  #на выводе 7 штук


Почему идет рассинхронизация с хранилищами в контейнере и хранилищами, которые я открываю через pycades?
Offline Андрей *  
#2 Оставлено : 17 июня 2024 г. 12:57:35(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Здравствуйте.

Цитата:

with open('certificate.cer', 'rb') as cert:
cert.Import(cert.read())



чисто логически - а как \ где \ кто будет искать\использовать контейнер с закрытым ключом?
Само собой должно сработать? Просто добавим сертификат, а внутри пусть само думает, где ключ... в папке\флешке\токене\облаке?




Начните с минимального примера
+
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
+
показывайте, какие сертификаты и с какими контейнерами связаны.

Цитата:
/opt/cprocsp/bin/amd64/certmgr -list -cert -store uMy



по ошибке:
Exception: The system cannot find the file specified. (0x80070002)


Цитата:
При просмотре хранилища в контейнере:

Код:
CurrentUser: здесь пусто
LocalMachine:
..
..





пример, как обычно должно быть:

/opt/cprocsp/bin/amd64/certmgr -enumstores all_locations
CurrentUser:
ca
Default
LocalMachine
my
Default

request
Default
root
Default
LocalMachine
cache
Default
cryptoprotrustedstore
Default
LocalMachine
addressbook
Default
LocalMachine
LocalMachine:
ca
Default
my
Default
request
Default
root
Default
cache
Default
clientauthissuer
Default
cryptoprotrustedstore
Default
addressbook
Default

[ErrorCode: 0x00000000]



основные вопросы - где контейнер\почему возникает необходимость добавлять из кода сертификат из файла
и зачем работа с pycades.CAPICOM_ROOT_STORE


Техническую поддержку оказываем тут
Наша база знаний
Offline Павел Геннадьевич  
#3 Оставлено : 17 июня 2024 г. 15:38:32(UTC)
Павел Геннадьевич

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.06.2024(UTC)
Сообщений: 5

У меня приложение развернуто в контейнере, я загружаю туда сертификат с закрытым ключом
Код:
certmgr -inst -pfx -file f.pfx -pin 1 -silent -store uMy

и ожидаю, что он будет в хранилище CurrentUser-> my.

Проверяю хранилища в контейнере:

Код:
/opt/cprocsp/bin/amd64/certmgr -enumstores all_locations


Код:

CurrentUser:
  my
    Default
LocalMachine:
  cryptoprotrustedstore
    Default
  root
    Default
  ca
    Default
  my
    Default



Проверяю связь контейнера и сертификата:
Код:
/opt/cprocsp/bin/amd64/certmgr -list -cert -store uMy


Код:

=============================================================================
1-------
Issuer              : E=ca@sertum.ru, OGRN=1116673008539, INNLE=6673240328, C=RU, S=66 Свердловская область, L=Екатеринбург, STREET="ул. Малопрудная, стр. 5, офис 715", O="ООО ""Сертум-Про""", CN="ООО ""Сертум-Про"""
Subject             : E=fedu@list.ru, INN=780418471090, SNILS=11220609994, G=Дмитрий Юрьевич, SN=Федоров, CN=Федоров Дмитрий Юрьевич
Serial              : ...............
SHA1 Thumbprint     : ...............
SubjKeyID           : ...............
Signature Algorithm : ГОСТ Р 34.11-2012/34.10-2012 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits)
Not valid before    : 10/01/2024  11:11:23 UTC
Not valid after     : 10/01/2025  11:17:15 UTC
Embedded License    : CryptoPro CSP
PrivateKey Link     : Yes
Container           : HDIMAGE\\pfx-23ee.000\CF19
Provider Name       : Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Provider Info       : Provider Type: 80, Key Spec: 1, Flags: 0x0
Identification Kind : Without personal presence by qualified signature
OCSP URL            : http://pki3................
OCSP URL            : http://ocsp...............
CA cert URL         : http://ca.sertu...............
CA cert URL         : http://ca.sert...............
CDP                 : http://ca.s...............
CDP                 : http://ca.s...............
Extended Key Usage  : 1................ Проверка подлинности клиента
                      1................
                      1................ Защищенная электронная почта
                      1...............
                      1............... Квалифицированный сертификат
2-------
Issuer              : E=dit@digital.gov.ru, C=RU, S=77 Москва, L=г. Москва, STREET="Пресненская набережная, дом 10, строение 2", O=Минцифры России, OGRN=1047702026701, INNLE=7710474375, CN=Минцифры России
Subject             : E=dit@digital.gov.ru, C=RU, S=77 Москва, L=г. Москва, STREET="Пресненская набережная, дом 10, строение 2", O=Минцифры России, OGRN=1047702026701, INNLE=7710474375, CN=Минцифры России
Serial              : ....................................
SHA1 Thumbprint     : ....................................
SubjKeyID           : ....................................
Signature Algorithm : ГОСТ Р 34.11-2012/34.10-2012 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits)
Not valid before    : 08/01/2022  13:32:39 UTC
Not valid after     : 08/01/2040  13:32:39 UTC
PrivateKey Link     : No
Identification Kind : Personal presence
3-------
Issuer              : E=dit@digital.gov.ru, C=RU, S=77 Москва, L=г. Москва, STREET="Пресненская набережная, дом 10, строение 2", O=Минцифры России, OGRN=1047702026701, INNLE=7710474375, CN=Минцифры России
Subject             : E=ca@sertum.ru, OGRN=1116673008539, INNLE=6673240328, C=RU, S=66 Свердловская область, L=Екатеринбург, STREET="ул. Малопрудная, стр. 5, офис 715", O="ООО ""Сертум-Про""", CN="ООО ""Сертум-Про"""
Serial              : ....................................
SHA1 Thumbprint     : ........................................
SubjKeyID           : ........................................
Signature Algorithm : ГОСТ Р 34.11-2012/34.10-2012 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits)
Not valid before    : 01/09/2023  12:39:41 UTC
Not valid after     : 01/09/2038  12:39:41 UTC
PrivateKey Link     : No
Identification Kind : Without personal presence by qualified signature
CA cert URL         : http://reest....................................
CDP                 : http://rees....................................
CDP                 : http://compan....................................
CDP                 : http://roste....................................
=============================================================================



Далее, если открываю хранилище через pycades и смотрю количество сертификатов, то получаю ноль:

Код:

from pycades import pycades

store = pycades.Store()
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
certs = store.Certificates
print(certs.Count)  # выводит 0



Ответы на вопросы:
- контейнер развернут на сервере
- нет задачи добавлять сертификат прямо из кода, он будет грузиться через certmgr для пользователя (предполагается, что будет один пользователь и сертификат).
- задачи работать с pycades.CAPICOM_ROOT_STORE нет. Это была плохая и отчаянная импровизация, чтобы подписать XML :)
Brick wall
Offline Андрей *  
#4 Оставлено : 17 июня 2024 г. 15:44:36(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
store.Open(pycades.CADESCOM_CONTAINER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)


вместо CADESCOM_CONTAINER_STORE если указать CADESCOM_CURRENT_USER_STORE сколько выдаст?

pycades запускается от того же пользователя, что и certmgr?



p.s.
PrivateKey Link : No

из хранилища личного лучше удалить сертификаты УЦ (Минцифры и Сертум-Про)

Отредактировано пользователем 17 июня 2024 г. 15:49:43(UTC)  | Причина: CADESCOM_CURRENT_USER_STORE

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 17 июня 2024 г. 15:48:58(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
в примерах используются контейнеры для поиска (CADESCOM_CONTAINER_STORE),
тестовый сертификат как раз получается так и записывается в сам контейнер тоже. Через импорт pfx - установка в хранилище и связь с контейнером только.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#6 Оставлено : 17 июня 2024 г. 15:50:44(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline Павел Геннадьевич  
#7 Оставлено : 17 июня 2024 г. 16:10:44(UTC)
Павел Геннадьевич

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.06.2024(UTC)
Сообщений: 5

Автор: Андрей * Перейти к цитате

вместо CADESCOM_CONTAINER_STORE если указать CADESCOM_CURRENT_USER_STORE сколько выдаст?


Если пытаюсь открыть хранилище вот так
Код:
store.Open(pycades.CADESCOM_CURRENT_USER_STORE, pycades.CAPICOM_MY_STORE, pycades.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)


то сразу же получаю ошибку:
Код:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.12/site-packages/pycades/__init__.py", line 44, in __call__
    value = self._original_instance(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Exception: The system cannot find the file specified. (0x80070002)


Но, если даже в оболочке python смотрю на хранилище, то вижу это:
Код:

result = subprocess.run('/opt/cprocsp/bin/amd64/certmgr -enumstores all_locations', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
print(result.stdout.decode('utf-8'))


Код:

CurrentUser:
  my
    Default
LocalMachine:
  cryptoprotrustedstore
    Default
  root
    Default
  ca
    Default
  my
    Default



Автор: Андрей * Перейти к цитате

pycades запускается от того же пользователя, что и certmgr?

Я захожу в контейнер под root'ом, устанавливаю сертификат и открываю консоль python под ним же (через python3).
Так что технически - да, от одного пользователя.

Автор: Андрей * Перейти к цитате

p.s.
PrivateKey Link : No

из хранилища личного лучше удалить сертификаты УЦ (Минцифры и Сертум-Про)


Да, спасибо. Удалил их)

Локации из документации перебрал все. Нигде моего предустановленного сертификата нет.

Отредактировано пользователем 17 июня 2024 г. 16:11:36(UTC)  | Причина: Не указана

Offline Павел Геннадьевич  
#8 Оставлено : 18 июня 2024 г. 11:42:00(UTC)
Павел Геннадьевич

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.06.2024(UTC)
Сообщений: 5

Есть какие-нибудь мысли, почему pycades может не видеть существующие в контейнере хранилища?
Offline Павел Геннадьевич  
#9 Оставлено : 20 июня 2024 г. 9:14:03(UTC)
Павел Геннадьевич

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.06.2024(UTC)
Сообщений: 5

Решение найдено! Неправильно ставилась библиотека pycades.
Offline Андрей *  
#10 Оставлено : 20 июня 2024 г. 12:22:19(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,340
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Автор: Павел Геннадьевич Перейти к цитате
Решение найдено! Неправильно ставилась библиотека pycades.


предлагаю описать, для истории будет полезно другим
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.