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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ssladkov  
#1 Оставлено : 27 октября 2010 г. 19:02:33(UTC)
ssladkov

Статус: Участник

Группы: Участники
Зарегистрирован: 15.09.2010(UTC)
Сообщений: 19
Мужчина
Откуда: Москва

Не удается при проверки подписи использовать сертификат, не зарегистрированный в системном хранилище.
Для этого использую поле pfnGetSignerCertificate структуры CRYPT_VERIFY_MESSAGE_PARA для задания callback метода
для указания сертификата, точно так же как делал для работы через Windows CryptoApi (где это работало). Но cades.dll
не вызывает этот callback и ищет сертификат в системном хранилище и если его нет возвращает ошибку.

Делаю так:

CRYPT_VERIFY_MESSAGE_PARA cryptVerifyPara;
memset(&cryptVerifyPara, 0, sizeof(cryptVerifyPara));
cryptVerifyPara.cbSize = sizeof(cryptVerifyPara);
cryptVerifyPara.dwMsgAndCertEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
cryptVerifyPara.pfnGetSignerCertificate = &GetCadesCertificateCallBack;
cryptVerifyPara.pvGetArg = (LPVOID) cert.GetContext();



CADES_VERIFY_MESSAGE_PARA verifyPara;
memset(&verifyPara, 0, sizeof(verifyPara));
verifyPara.dwSize = sizeof(CADES_VERIFY_MESSAGE_PARA);
verifyPara.pVerifyMessagePara = &cryptVerifyPara;
verifyPara.pCadesVerifyPara = 0;
CADES_VERIFICATION_INFO *pVerifyInfo = 0;

const BYTE* rgpbToBeSigned[1];
rgpbToBeSigned[0] = pbyData;
BOOL bChecked = CadesVerifyDetachedMessage(&verifyPara, 0,
pbySign, dwSignLen, 1, rgpbToBeSigned, &dwDataLen, &pVerifyInfo);

Отредактировано пользователем 27 октября 2010 г. 19:03:10(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#2 Оставлено : 27 октября 2010 г. 19:57:47(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
А каким образом создавалась подпись?

Дело в том, что в приведенном фрагменте кода функция CadesVerifyDetachedMessage будет проверять подпись на соответствие формату УЭЦП (CAdES-X Long Type 1). Данный формат подразумевает, что сертификат ключа подписи содержится внутри подписанного сообщения и именно там и ищется в первую очередь.
Offline ssladkov  
#3 Оставлено : 27 октября 2010 г. 20:51:20(UTC)
ssladkov

Статус: Участник

Группы: Участники
Зарегистрирован: 15.09.2010(UTC)
Сообщений: 19
Мужчина
Откуда: Москва

Новожилова Елена написал:
А каким образом создавалась подпись?

Дело в том, что в приведенном фрагменте кода функция CadesVerifyDetachedMessage будет проверять подпись на соответствие формату УЭЦП (CAdES-X Long Type 1). Данный формат подразумевает, что сертификат ключа подписи содержится внутри подписанного сообщения и именно там и ищется в первую очередь.


Подписываю с помощью CadesSignMessage, но так чтобы никакие сертификаты не включались в подпись - они там не нужны. Для этого устанавливаю rgpMsgCert=0 и cMsgCert=0 в структуре CRYPT_SIGN_MESSAGE_PARA.
dwCadesType у меня равно CADES_BES (но должно работать и с CADES_X_LONG_TYPE_1).
И теперь если сертификат не установлен - подпись не проверяется, если установлен - проверяется. При использовании Windows Crypto Api все работало нормально.
Offline Новожилова Елена  
#4 Оставлено : 28 октября 2010 г. 19:16:23(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
ssladkov написал:
Подписываю с помощью CadesSignMessage, но так чтобы никакие сертификаты не включались в подпись - они там не нужны. Для этого устанавливаю rgpMsgCert=0 и cMsgCert=0 в структуре CRYPT_SIGN_MESSAGE_PARA.
dwCadesType у меня равно CADES_BES (но должно работать и с CADES_X_LONG_TYPE_1).


Параметры rgpMsgCert и cMsgCert в структуре CRYPT_SIGN_MESSAGE_PARA влияют только на добавление дополнительных сертификатов в коллекцию Certificates. Данные параметры не имеют никакого отношения к созданию подписи при помощи CadesSignMessage() - в соответствие со стандартом ETSI TS 101 733 (CAdES) сертификаты добавляются в неподписанный атрибут Certificate Values в зависимости от создаваемого формата подписи:

При создании подписи формата CADES_X_LONG_TYPE_1 при вызове CadesSignMessage() все сертификаты будут добавлены в неподписанный атрибут Certificate Values. Причем будет добавлен не только сертификат ключа подписи.

При создании подписи формата CADES_BES при вызове CadesSignMessage() в неподписанный атрибут Certificate Values никакие сертификаты не добавляются и сам атрибут не создается.

Поэтому в Вашем случае сертификат ключа подписи в подписанном сообщении будет отсутствовать (но не в случае с CADES_X_LONG_TYPE_1).

ssladkov написал:
И теперь если сертификат не установлен - подпись не проверяется, если установлен - проверяется. При использовании Windows Crypto Api все работало нормально.


Это ошибка в КриптоПро ЭЦП SDK - нам удалось ее воспроизвести и скорее всего, исправленный билд будет доступен в середине ноября.

В настоящее время для того,чтобы подать сертификат ключа подписи в функцию CadesVerifyDetachedMessage() Вы можете использовать параметр hStore структуры CADES_VERIFICATION_PARA

Отредактировано пользователем 28 октября 2010 г. 20:13:15(UTC)  | Причина: Не указана

Offline ssladkov  
#5 Оставлено : 29 октября 2010 г. 21:27:32(UTC)
ssladkov

Статус: Участник

Группы: Участники
Зарегистрирован: 15.09.2010(UTC)
Сообщений: 19
Мужчина
Откуда: Москва

Спасибо за развернутый ответ. Уточните, пожалуйста, еще такие моменты:

1) Правильно ли я понимаю, что в случае подписи CADES_X_LONG_TYPE_1, сертификат так же будет браться из hStore структуры CADES_VERIFICATION_PARA (если он установлен)?

2) Я не уверен, что правильно понимаю методологию использования библиотек БЕЗ подавания сертификата ключа подписи на вход ф-ции проверки подписи. Правильно ли следующее:

Если не использовать hStore (и callback для поиска сертификата), то библиотека cades проверит подпись, но не будет проверять саму цепочку сертификатов, т.е. пользователь библиотеки должен сам удостовериться, что к сертификату можно доверять (проверить цепочку сертификатов, либо убедиться что это тот сертификат, которым ожидается, что будут подписаны данные)?
Offline Новожилова Елена  
#6 Оставлено : 1 ноября 2010 г. 15:16:25(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Цитата:
1) Правильно ли я понимаю, что в случае подписи CADES_X_LONG_TYPE_1, сертификат так же будет браться из hStore структуры CADES_VERIFICATION_PARA (если он установлен)?


В случае проверки подписи CADES_X_LONG_TYPE_1 сертификат ключа подписи будет браться из неподписанного атрибута Certificate Values. Вы можете подать дополнительное хранилище - но в этом не будет никакого смысла, так как сертификат УЖЕ содержится в сообщении. См. документацию к структуре CADES_VERIFICATION_PARA: "При проверке подписи CAdES-X Long Type 1 данное поле (hStore) не используется, т.к. все необходимые данные содержатся в атрибутах подписи."

Цитата:
Если не использовать hStore (и callback для поиска сертификата), то библиотека cades проверит подпись, но не будет проверять саму цепочку сертификатов, т.е. пользователь библиотеки должен сам удостовериться, что к сертификату можно доверять (проверить цепочку сертификатов, либо убедиться что это тот сертификат, которым ожидается, что будут подписаны данные)?


Функции проверки подписи из состава КриптоПро ЭЦП SDK производят проверку подписи целиком (проверка криптографической подписи + построение и проверка цепочки).

Если проверяется подпись CAdES BES, то сертификаты, необходимые для проверки подписи, ищутся в хранилищах текущего пользователя "My" (Личные), "Addressbook" (Другие пользователи), "CA" (Промежуточные центры сертификации) и "Root" (Доверенные корневые центры сертификации). Если поле hStore заполнено, то поиск сертификатов и списков отзыва сертификатов осуществляется дополнительно в этом хранилище. При проверке подписи CAdES-X Long Type 1 данное поле не используется, т.к. все необходимые данные содержатся в атрибутах подписи. Если задана callback-функция для поиска сертификата ключа подписи, то она также будет использована.

Если сертификат ключа подписи не будет обнаружен при проверке ни в одном из указанных выше мест (то есть он отсутствует в хранилищах, не задана или не находит сертификат callback-функция и не задано или не содержит искомого сертификата дополнительное хранилище hStore), то функция проверки вернет ошибку.
Offline ssladkov  
#7 Оставлено : 1 ноября 2010 г. 16:12:29(UTC)
ssladkov

Статус: Участник

Группы: Участники
Зарегистрирован: 15.09.2010(UTC)
Сообщений: 19
Мужчина
Откуда: Москва

Еще раз спасибо. Еще уточнение, пожалуйста. Хочу удостоверится, что все правильно понял

Одна из моделей работы с сертификатами у нас такая - все сертификаты храняться в базе данных. К тем сертификатам, которые зарегистрированны в системном хранилище, но которых нет в базе данных доверия у системы нет.

1) В случае CADES_X_LONG_TYPE_1 удачная проверка подписи говорит лишь о том, что данные подписаны
сертификатом, содержащимся в подписи, который выдан одним из центров сертификации, чей сертификат установлен виндоуз, скажем это может быть google или microsoft (они есть в стандартном хранилище) или кто угодно.

2) В случае CAdES BES - удачная проверка говорит, что это подпись произведена любым сертификатом из "My" или "Addressbook"

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

Отредактировано пользователем 1 ноября 2010 г. 16:13:36(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#8 Оставлено : 1 ноября 2010 г. 16:45:52(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
1. Да. С тем уточнением, что для успешной проверки корневой сертификат должен быть установлен в хранилище "Доверенные корневые центры сертификации".

2. Не совсем. Так же как и предыдущем случае для успешной проверки корневой сертификат должен быть установлен в хранилище "Доверенные корневые центры сертификации".

Цитата:
Получается, чтобы обеспечить безопасность исходя из той модели что я говорил в начале, после того как библиотека cades проверит подпись, мне потребуется самому проверить сертификат на котором происходила эта проверка(сравнить с теми что в базе данных). Я все правильно понял?


Да, все верно.
В данном случае все зависит от принятой в Вашей организации модели безопасности - проверять ли на наличие в БД только сертификат, на котором создана подпись, или проверять все сертификаты, входящие в его цепочку. Или, например, проверять только корневой сертификат.
Offline Павел Смирнов  
#9 Оставлено : 17 ноября 2010 г. 12:17:52(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
ssladkov написал:
И теперь если сертификат не установлен - подпись не проверяется, если установлен - проверяется. При использовании Windows Crypto Api все работало нормально.

Выложена исправленная версия SDK.
Техническую поддержку оказываем тут.
Наша база знаний.
Offline Павел Смирнов  
#10 Оставлено : 18 ноября 2010 г. 11:14:03(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Новожилова Елена написал:
ssladkov написал:
И теперь если сертификат не установлен - подпись не проверяется, если установлен - проверяется. При использовании Windows Crypto Api все работало нормально.

Это ошибка в КриптоПро ЭЦП SDK

Предлагаю всё же это ошибкой не считать. О том, что эта функциональность не поддерживается, было явно написано:
Код:
Поля pVerifyMessagePara->pfnGetSignerCertificate и pVerifyMessagePara->pvGetArg не используются и должны быть равны NULL. Для расширения алгоритма поиска сертификата подписи используйте поле pCadesVerifyPara->hStore. 
Техническую поддержку оказываем тут.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.