Тема: Выбор сертификата подписи

Добрый день, коллеги!

Работаю на c# с библиотекой vcpia2.
Задача: реализовать конверт КБР-Н с подписями КА и ЗК. Задача успешно выполнена. Я задаю при инициализации VcertObject профиль. Для подписи, если я правильно понимаю, используется рабочий сертификат выбранного профиля из его справочника сертификатов. Соответственно КА и ЗК формируются на одном ключе. Сейчас выяснилось, что требуется два ключа: один для КА, другой для ЗК.

У меня в справочнике есть два сертификата. Один для КА, другой для ЗК. Один из них установлен как рабочий.
Список сертификатов я успешно получаю с помощью метода FindCertificates() и могу легко найти те, которые мне нужны.

Но встаёт вопрос, ответ на который я не нашёл в документации: могу ли я как-нибудь при подписи задать сертификат? Чтобы при формировании КА я установил один, а при формировании ЗК другой? Или быть может временно установить рабочим один сертификат, потом другой?

Заранее благодарен.

2

Re: Выбор сертификата подписи

Добрый день!

Задать сертификат при подписи нельзя, подпись выполняется на рабочем сертификате.
В Вашем случае нужно создать два профиля в справочнике сертификатов, один для КА, другой для ЗК. А в программе инициализировать два объекта VcertObject с указанием профилей КА и ЗК.

Re: Выбор сертификата подписи

Всем, день добрый!
Вопрос насчет подписи и проверки ЭС по третьему варианту защиты. Если кратко, в своем софте подписываю, т.е. проставляю ЗК и КА. Конечно для КА И ЗК используются разные справочники сертификатов. Проверяю, все хорошо работает в разных вариациях, получаю подписанные и проверенные xml-и. Но АРМ КБР-Н ругается на мои xml при проверке КА, до ЗК пока не дошли, думаю там будет тоже самое. Беру их xml, ругается моя проверка. Доступа к КБР-ам у меня нет, по крайней мере пока. Есть только скрины настроек, из которых вижу, что везде прописаны OID. Отсюда вопросы:
1. При вызове функций сигнатуры из своего ПО, для VerifyParam указываю OID через extKeyUsage, но не помогает. Флаги естественно нужные выставляю. Пробовал и без указания extKeyUsage.
2. mycert могу заполнять, а могу и нет. Я так понимаю, что если не заполняю, то используется рабочий сертификат справочника.  А если заполню то могу подписать другим  сертификатом, указав "Идентификатор ключа ЭП"?
3. При подписи для SignParam свойства extKeyUsage нет. Можно конечно пробовать указать OID-ы через PKI.Extension или PKI.Policy но этого еще не делал. Как правильно в приложении использовать эти OID-ы, и влияют ли они на подпись и проверку? Вроде если их не указать, то должно игнорировать область применения, но проверка не проходит.

4

Re: Выбор сертификата подписи

Добрый день!

1. Если в extKeyUsage в VerifyParam указаны ОИД-ы, то, при проверке подписи, сертификат, на котором выполнена ЭП, будет проверяться на наличие заданных ОИД-ов.
2,3. Задать сертификат при подписи нельзя, подпись выполняется на рабочем сертификате.

Re: Выбор сертификата подписи

alart, спасибо, но легче мне пока не стало. Получается делаю все правильно, а с КБР-Н не срастается.

alart пишет:

1. Если в extKeyUsage в VerifyParam указаны ОИД-ы, то, при проверке подписи, сертификат, на котором выполнена ЭП, будет проверяться на наличие заданных ОИД-ов.

1.1. Т.е. при проверке тоже берет рабочий сертификат?
1.2. Если в рабочем сертификате нет прописанного OID-а, какой сертификат возьмет тогда? А если в справочнике несколько сертификатов с заданным OID-ом? 
1.3. Поле info в VerifyParam должно быть установлено в Field_Subject ?

alart пишет:

2,3. Задать сертификат при подписи нельзя, подпись выполняется на рабочем сертификате.

2.1. При проверке тоже нельзя?
2.2. На что тогда влияет поле mycert  в объекте PKI.SignParam ?
2.3. Для чего нужны policies и extensions, которые есть и в объекте PKI.SignParam и в PKI.VerifyParam ?

P.S. Просьба не отвечать по два дня на вопросы, они вроде не такие сложные для тех, кто разрабатывал библиотеку.

Re: Выбор сертификата подписи

Виталий пишет:

1.3. Поле info в VerifyParam должно быть установлено в Field_Subject ?

Для чего нужно поле info уже разобрался.

7

Re: Выбор сертификата подписи

1.1 Нет, для проверки подписи используется сертификат, на котором эта подпись была выполнена.
1.2 Если в сертификате, на котором была выполнена подпись, отсутствует ОИД, указанный в VerifyParam, то будет выдана ошибка.

2.1 Нельзя.
2.2 Поле mycert используется при работе с КриптоСервером, его заполнять не нужно.
2.3 policies и extensions в SignParam отсутствуют. Если в VerifyParam указать policies, extensions или extKeyUsage, то будет выполнена проверка, содержит ли сертификат, на котором выполнена подпись, указанные ОИДы.

А есть код и описание ошибки, которую выдает АРМ КБР?

Re: Выбор сертификата подписи

alart, спасибо большое за ответы! Ошибка была стандартная - OLE error E0700019(Ошибка проверки ЭП). Но я разобрался из-за чего не срасталось, сейчас с проверкой КА все нормально, осталось только ЗК, но здесь еще нормализацию доделать и все думаю будет тоже хорошо.

alart пишет:

2.3 policies и extensions в SignParam отсутствуют

- да, действительно так, когда писал, поторопился,  не на ту страницу в документации глянул.

Re: Выбор сертификата подписи

alart, и еще заодно вопрос для общего понимания - методы EncryptMem/DecryptMem, здесь уже получается мы задаем сертификат для шифрования через mycert, судя по примерам?

10

Re: Выбор сертификата подписи

Шифрование и расшифрование выполняется на рабочем сертификате. В документации для методов EncryptMem и DecryptMem приведены примеры работы с КриптоСервером.

11

Re: Выбор сертификата подписи

alart, забыл сказать спасибо.

12

Re: Выбор сертификата подписи

Добрый день!
Есть такая проблема.
Имеются входные документы полученные для теста из МЦОИ. Они подписаны КА и ЗК "МЦОИ Банка России, контур контроля КЦОИ-МР". Эти ключи проимпортированы и в наши справочники тоже. Для работы по третьему/второму варианту защиты мы имеем у себя ключи для проверки отличные от данных, отдельно для КА и отдельно для ЗК. Естественно, на своей АБС получаем ошибку проверки ЭЦП. В тоже время КБР-Н неким образом проверяет этот документ и не ругается на ЭЦП. И вот интересно каким образом это происходит? При использовании сигнатуровской библиотеки для работы с ЭЦП, она работает с текущим сертификатом в справочнике, который мы указываем при инициализации контекста. Т.е. у нас есть два справочника для КА и для ЗК, где есть соответствующие рабочие сертификаты. И в папке vdkeys у нас тоже только два наших ключа для проверки КА и ЗК, отличные от МЦОИ-ких. Поэтому вопрос, каким образом сигнатура при проверке из АРМ КБР-Н не выдает ошибки, и как можно сделать это на стороне АБС?

13

Re: Выбор сертификата подписи

Добрый день!

А перед проверкой документа над ним выполняются какие-то действия (извлечение подписи, удаление каких-то элементов)?
Возможно, в Вашей программе и в АРМ КБР-Н эти действия выполняются по-разному.

14 (2018-04-02 20:25:09 отредактировано Виталий)

Re: Выбор сертификата подписи

alart, выполняются конечно. Все как описано в документах ЦБ РФ по подписи xml. Суть не в этом. С МЦОИ переписываться немного сложновато, но они утверждают, что в справочники должны быть импортированы сертификаты, их сертификаты. У нас так и есть. Базы справочников взяты с машины, где стоит КБР-Н. Я туда доступа не имею, но там флешка с ключами, только с нашими, папка vdkeys. Но на КБР-Н проверка проходит. Я так понимаю, что если на нашей машине закинуть на флешку в vdkeys соответствующие ключи, то проверка бы прошла. Но у нас их нет. Кстати, при подписи работает по текущему сертификату, а проверке ЭЦП получается по тому который в подписи?
И вот непонятно, где КБР-Н берет нужные ключи?

15

Re: Выбор сертификата подписи

при подписи работает по текущему сертификату, а проверке ЭЦП получается по тому который в подписи?

Да.

Я так понимаю, что если на нашей машине закинуть на флешку в vdkeys соответствующие ключи, то проверка бы прошла.

Нет, закрытые ключи (которые хранятся на флешке в папке vdkeys) не используются для проверки подписи. Если сертификат, на котором выполнена ЭП, импортирован в справочник, то для проверки подписи этого достаточно, закрытые ключи не нужны.

Если при проверке подписи Сигнатура не находит в базе сертификат, на котором была выполнена подпись, то будет выдана ошибка "Сертификат не найден" (VCERT_E_CERT_NOT_FOUND 0xE0700046) или "Открытый ключ не найден (VCERT_E_OPENKEY_NOT_FOUND 0xE0700043).

16

Re: Выбор сертификата подписи

Может не совсем понятно про ключи написал. У нас есть два ключа, для ЗК и КА, их выдал МЦОИ. Они на тестовой машине на флешке и на машине, где стоит КБР-Н. И КБР-Н, как-то проверяет, т.е. сигнатура, получается где-то, как-то видит эти МЦОИ-ские ключи, хотя на флешке их нет. Есть только сертификаты в справочнике.

17

Re: Выбор сертификата подписи

alart не увидел ваше сообщение, сейчас почитаю smile.

18

Re: Выбор сертификата подписи

Да, сообщение другое, о том что подпись не валидна, значит проблема в нормализации/канонизации. Пока спасибо.

19

Re: Выбор сертификата подписи

alart, а сертификаты, которыми подписано сообщение просто должны быть в справочнике, или может их еще надо выгружать и регистрировать в системе?

20

Re: Выбор сертификата подписи

Сертификаты, которыми подписано сообщение, просто должны быть в справочнике, ничего дополнительно делать не нужно.

21

Re: Выбор сертификата подписи

alart, спасибо, разобрался. Проблема была на самом деле у меня в OID-ах. Для МЦОИ-ких сертификатов нужно прописывать свои OID-ы.