Статус: Новичок
Группы: Участники
Зарегистрирован: 03.11.2017(UTC) Сообщений: 4
Сказал(а) «Спасибо»: 5 раз
|
Добрый день, коллеги! Вводная. Моя задача до банального просто: есть массив байт, который надо подписать закрытым ключом по алгоритму ГОСТ 3410 2012 256, а хэш по ГОСТ 3411 2012 256. Если я использую Код:Gost3410_2012_256CryptoServiceProvider
, то у меня отлично получается подписать и проверить в дальнейшем подпись. И я уверен какие алгоритмы используются для хэширования и подписи, так как использую конкретные классы. Теперь мне необходимо сохранить всё это в формате CMS. Для этого я использую примеры из SDK, которые прекрасно работают. Но у меня есть отличие от примеров, которое, заключается, во-первых, в том, что сертификат свой я беру из контейнера крипто про, а во-вторых я сам делаю проверку, выдан ли он доверенным центром. Получаю сертификат следующим образом (2 варианта): Код:
byte[] data =
{
59, 4, 248, 102, 77, 97, 142, 201, 21, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135
};
CspParameters cp = new CspParameters
{
KeyContainerName = "ContainerName",
ProviderType = 80,
ProviderName = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
KeyPassword = "password".ToSecure(),
Flags = CspProviderFlags.NoPrompt,
};
Gost3410_2012_256CryptoServiceProvider gost = new Gost3410_2012_256CryptoServiceProvider(cp);
ContentInfo contentInfo = new ContentInfo(data);
SignedCms signedCms = new SignedCms(contentInfo);
//Вариант 1. Пытался брать сертификат из объекта
CmsSigner cmsSigner = new CmsSigner(gost.ContainerCertificate);
//Вариант 2. Пытался брать сертификат из объекта CspParameters
//CmsSigner cmsSigner = new CmsSigner(cp);
signedCms.ComputeSignature(cmsSigner);
WriteLine(Convert.ToBase64String(signedCms.Encode()));
Если использовать Вариант 1, то получаю сообщение: "Не удается построить цепочку сертификатов для доверенного корневого центра.". Полагаю, что криптопровайдер пытается проверить доверенность сертификата, но мне этого не надо, так как я это делаю сам. Отсюда первый вопрос: как можно это отключить?Если использовать Вариант 2, то получаю сообщение: "Ключ не существует". Второй вопрос: Почему он не может найти ключ? При этом с ключами проблем нет. Они находятся, если производить подпись через класс Код:Gost3410_2012_256CryptoServiceProvider
Ещё один вопрос: если я использую SignedCms и CmsSigner, то каким образом выбирается алгоритм подписи и хэша? Берётся из сертификата? Но в сертификате указано несколько алгоритмов. Какой из них выбирается? Заранее благодарю за любую помощь.
|