Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Цитата:Помогите разобраться с ошибкой. Пытаюсь подписать запрос для отправки в СМЭВ. При попытке подписать XML в режиме CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE, получаю ошибку "An error was encountered while processing an XML digital signature" Добрый день. Странно, что пример по структуре для смэв 2, да и то не хватает AppData. На смэв 3 вообще непохоже ни структурой ни подписью. Ближе к вопросу - предположу, что как минимум дело в том, что в шаблоне указаны алгоритмы гост-2001, а реальный ключ скорее всего гост-2012, так как гост-2001 запрещен в 2020 году. SignatureMethod должен совпадать с алгоритмом ключа, ну и реальный СМЭВ скорее всего откажется принимать смешанный вариант когда DigestMethod и SignatureMethod разных алгоритмов. Код:urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256
urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256
Цитата:1. Может ли данное расширение работать с ключами, на контейнеры которых установлен пароль? 2. Если нет, подскажите пожалуйста, методы в интерфейсе С, которые могут работать с такими запароленными контейнерами. 3. Как задать свой адрес ocsp-сервиса? Я правильно понимаю, что в таком случае проверка любой подписи, в сертификате которой не указан oscp, пойдет через этот "свой ocsp-сервис"? 4. Может ли так оказаться что после запроса в сторону своего ocsp-сервиса, продолжится проверка по crl спискам из сертификата подписи? 1. Нужно задать пароль до фактического использования ключа. Полагаю, что это возможно в расширении (точнее надо искать в справке). Многое зависит будет ли приложение в серверном режиме без пользователя или тихом режиме или пользователь сможет ввести пароль. Если пользователь может ввести пароль можно вообще не беспокоиться, а вот в серверном или тихом режиме пароль надо или задать в приложении или запомнить средствами криптопровайдера. 2. Насколько помню для этого можно использовать CryptSetProvParam PP_EXCHANGE_PIN (или PP_SIGNATURE_PIN) Там есть градации от криптопровайдера и носителя, некоторые носители поддерживают также смену пинкода этой функцией, но большинство только указывает пароль для следующей операции с ключом. 3. можно задать отдельно при проверке по мере необходимости. В справке говорится про специальные свойства хранилища сертификатов для сертификата УЦ - так можно адресовать конкретный УЦ. И потом уже групповая политика - для всех подписей. 4. полагаю да, если ocsp ответа не будет или сам ответ не удается проверить. Отредактировано пользователем 28 декабря 2020 г. 11:08:58(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил two_oceans за этот пост.
|
bsoft оставлено 14.01.2021(UTC)
|
|
Статус: Администратор
Группы: Участники
Зарегистрирован: 01.03.2017(UTC) Сообщений: 103 Откуда: Москва Сказал(а) «Спасибо»: 7 раз Поблагодарили: 34 раз в 25 постах
|
Цитата:Цитата: 1. Может ли данное расширение работать с ключами, на контейнеры которых установлен пароль? 2. Если нет, подскажите пожалуйста, методы в интерфейсе С, которые могут работать с такими запароленными контейнерами. 3. Как задать свой адрес ocsp-сервиса? Я правильно понимаю, что в таком случае проверка любой подписи, в сертификате которой не указан oscp, пойдет через этот "свой ocsp-сервис"? 4. Может ли так оказаться что после запроса в сторону своего ocsp-сервиса, продолжится проверка по crl спискам из сертификата подписи?
1. Нужно задать пароль до фактического использования ключа. Полагаю, что это возможно в расширении (точнее надо искать в справке). Многое зависит будет ли приложение в серверном режиме без пользователя или тихом режиме или пользователь сможет ввести пароль. Если пользователь может ввести пароль можно вообще не беспокоиться, а вот в серверном или тихом режиме пароль надо или задать в приложении или запомнить средствами криптопровайдера. 2. Насколько помню для этого можно использовать CryptSetProvParam PP_EXCHANGE_PIN (или PP_SIGNATURE_PIN) Там есть градации от криптопровайдера и носителя, некоторые носители поддерживают также смену пинкода этой функцией, но большинство только указывает пароль для следующей операции с ключом. 3. можно задать отдельно при проверке по мере необходимости. В справке говорится про специальные свойства хранилища сертификатов для сертификата УЦ - так можно адресовать конкретный УЦ. И потом уже групповая политика - для всех подписей. 4. полагаю да, если ocsp ответа не будет или сам ответ не удается проверить. Добрый день. 1. Да, может. В коде задать пароль можно, используя свойтво Signer.KeyPin. 3. Можно воспользоваться групповыми политиками или задать в свойствах сертификата издателя для данного сертификата. Порядок обхода указан здесь. Если определить статус сертификата через OCSP не удалось, используются CRL. 4. Да. Отредактировано пользователем 28 декабря 2020 г. 12:27:54(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.12.2020(UTC) Сообщений: 17 Сказал(а) «Спасибо»: 11 раз
|
Автор: two_oceans Странно, что пример по структуре для смэв 2, да и то не хватает AppData. На смэв 3 вообще непохоже ни структурой ни подписью. Это Региональный СМЭВ. Оператор РСМЭВ создал на его базе функционал по централизованной регистрации заявлений на государственные (муниципальные) услуги. Я пишу адаптер для муниципальной информационной системы. Автор: two_oceans Ближе к вопросу - предположу, что как минимум дело в том, что в шаблоне указаны алгоритмы гост-2001, а реальный ключ скорее всего гост-2012, так как гост-2001 запрещен в 2020 году. SignatureMethod должен совпадать с алгоритмом ключа, ну и реальный СМЭВ скорее всего откажется принимать смешанный вариант когда DigestMethod и SignatureMethod разных алгоритмов. Спасибо! Помогло.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.11.2019(UTC) Сообщений: 54
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
Добрый день. Не могу разобраться с отделенной подписью. Код:
import sys
sys.path.append(r'/usr/local/lib/python3.8/pycades.so')
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)
assert(certs.Count != 0), "Certificates with private key not found"
signer = pycades.Signer()
signer.Certificate = certs.Item(1)
content = "test"
signedData = pycades.SignedData()
signedData.Content = content
signature = signedData.SignCades(signer, pycades.CADESCOM_CADES_BES, True)
print("--Signature--")
print(signature)
print(len(signature))
print("----")
_signedData = pycades.SignedData()
_signedData.Content = content
_signedData.VerifyCades(signature, pycades.CADESCOM_CADES_BES, True)
Получаю подпись. Размер подписи (base64 c переносами) = 8180 символов. Далее создаю текстовый файл с содержимым "test" и пытаюсь проверить эту подпись в криптоАРМ. Получаю отрицательный результат. Создаю отделенную подпись при помощи расширения pycryptoprosdk. Проверяю в том же криптоАрме с тем же файлом "test" - получаю положительный вариант. При этом, если создать присоединенную подпись в pycades, то в криптоАрме она проверяется нормально. Так же в структуре подписи, созданной в pycades: Код:
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
SET (1 elem)
OCTET STRING (32 byte) 8BE25D8DB2AF0414B08307B23EF01892DE51D0A164605B41BDDE36ADAC5C6413
В структуре подписи, созданной pycryptoprosdk: Код:
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
SET (1 elem)
OCTET STRING (32 byte) 12A50838191B5504F1E5F2FD078714CF6B592B9D29AF99D0B10D8D02881C3857
Если хэшировать файл с содержимым "test" в консольной утилите, на выходе получаем хэш: Код:
/opt/cprocsp/bin/amd64/cryptcp -hash -dir /tmp -hashAlg 1.2.643.7.1.1.2.2 -hex /tmp/test
12A50838191B5504F1E5F2FD078714CF6B592B9D29AF99D0B10D8D02881C3857
При этом само расширение pycades собственную подпись проверяет успешно. Отредактировано пользователем 29 декабря 2020 г. 20:16:01(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.11.2019(UTC) Сообщений: 54
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
А можно ли, имея на руках подпись, используя данное расширение получить данные сертификата, ключем которого эта подпись создавалась?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,192 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 272 раз в 253 постах
|
Добрый день! обратите внимание на https://docs.cryptopro.r.../plugin/content-encodingзадайте ContentEncoding в CADESCOM_BASE64_TO_BINARY = 0x01 затем данные закодируйте в base64 и подайте в signedData.Content т.к. content = "test" в STRING_TO_UCS2LE будет иметь совершенно другой вид. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 25.11.2019(UTC) Сообщений: 54
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 1 раз в 1 постах
|
Автор: Санчир Момолдаев Добрый день! обратите внимание на https://docs.cryptopro.r.../plugin/content-encodingзадайте ContentEncoding в CADESCOM_BASE64_TO_BINARY = 0x01 затем данные закодируйте в base64 и подайте в signedData.Content т.к. content = "test" в STRING_TO_UCS2LE будет иметь совершенно другой вид. Да, после установки CADESCOM_BASE64_TO_BINARY работает корректно. Благодарю )
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,192 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 272 раз в 253 постах
|
Автор: mstdoc А можно ли, имея на руках подпись, используя данное расширение получить данные сертификата, ключем которого эта подпись создавалась? у проверяемого SignedData получить список Signer и т.д. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 02.01.2021(UTC) Сообщений: 2
Сказал(а) «Спасибо»: 1 раз
|
Добрый день, я бы хотел создать сайт на django для учёбы, чтобы там была возможность войти по ЭЦП и организовать подписание документов. Возможно ли реализовать это при помощи данного расширения? Или есть готовые решения?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,192 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 272 раз в 253 постах
|
Автор: Clutcher Добрый день, я бы хотел создать сайт на django для учёбы, чтобы там была возможность войти по ЭЦП и организовать подписание документов. Возможно ли реализовать это при помощи данного расширения? Или есть готовые решения? Добрый день. Именно на python примера нет. Общая мысль: у клиента должна подписываться некоторая уникальная строка которая приходит с сервера. На сервере проверяется подпись и сравниваются подписанные данные. Front: html + js (cades plugin) Backend: python + pycades |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close