Статус: Новичок
Группы: Участники
Зарегистрирован: 27.04.2020(UTC) Сообщений: 1 Откуда: Киров Сказал(а) «Спасибо»: 1 раз
|
Всем привет. Подскажите новичку КриптоПро, хочу проверить CADES подпись для CMS сообщения на .NET(C#)/ Пробовал найти, каким образом сделать подпись с помощью .Net SDK, но в их примерах не нашел работу с CADES подписями. Нужна проверка подписи типа x-long-type1.
Interop.CADESCom.dll единственный более менее разумный способ это сделать на C#? Она позволяет это сделать?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,356 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
Автор: Alexcei88 Всем привет. Подскажите новичку КриптоПро, хочу проверить CADES подпись для CMS сообщения на .NET(C#)/ Пробовал найти, каким образом сделать подпись с помощью .Net SDK, но в их примерах не нашел работу с CADES подписями. Нужна проверка подписи типа x-long-type1.
Interop.CADESCom.dll единственный более менее разумный способ это сделать на C#? Она позволяет это сделать? Да |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.08.2020(UTC) Сообщений: 9 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Всем привет!!! Подскажите пожалуйста! Я пытаюсь юзать simple35.zip из пакета КриптоПРО.NET SDK для подписи pdf из c# Изменил Sign.cs (simple35.zip) следующим образом:
// Вычисляем подпись //ContentInfo contentInfo = new ContentInfo(ss.ToArray()); //CmsSigner cmsSigner = new CmsSigner(certificate); //SignedCms signedCms = new SignedCms(contentInfo, true); //signedCms.ComputeSignature(cmsSigner, false); //byte[] pk = signedCms.Encode();
// ---- начало изменений // формируем УЭЦП // получаем и копируем контент Stream rangeStream = sap.GetRangeStream(); MemoryStream contentStream = new MemoryStream(); CopyTo(rangeStream, contentStream); byte[] content = contentStream.ToArray(); string tspServerAddress = @"http://www.cryptopro.ru/tsp/tsp.srf"; CPSigner cps = new CPSigner();
// ------------------------------------------------------------------------------------------ //cps.Certificate = GetCAPICOMCertificate(certificate.Thumbprint); CAPICOM.Store store = new Store(); store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY); var certificates = store.Certificates as CAPICOM.Certificates; //.Find(CAPICOM.CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_KEY_USAGE, //CAPICOM.CAPICOM_KEY_USAGE.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE); if (certificates.Count == 0) { myWriteLine("COPICOM Сертификатов не найдено!"); return 1; } var en = certificates.GetEnumerator(); en.MoveNext(); CAPICOM.Certificate cert = en.Current as CAPICOM.Certificate; string sCN = getCN(cert.SubjectName); string iCN = getCN(cert.IssuerName); string mySert = buildCertString(sCN, iCN); myWriteLine(mySert); cps.Certificate = cert; // -----------------------------------------------------------------------------------------
cps.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN; cps.TSAAddress = tspServerAddress; CadesSignedData csd = new CadesSignedData(); // base64 csd.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY; csd.Content = Convert.ToBase64String(content); // Создание подписи CAdES BES string signature = null; signature = csd.SignCades(cps, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64); // Дополнение подписи CAdES BES до подписи CAdES X Long Type 1 signature = csd.EnhanceCades(CADESCOM_CADES_TYPE.CADESCOM_CADES_X_LONG_TYPE_1, tspServerAddress, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64); // byte[] pk = GetBytes(signature); byte[] pk = Convert.FromBase64String(signature); // -------конец изменений
В момент вызова csd.EnhanceCades генерится исключение: {"Не удается построить цепочку сертификатов для доверенного корневого центра."}
Не могу понять - дело в сертификате или же все таки я что то в коде упустил. Сертификат создан по ГОСТ Р 34.11/34.10-2001 с ключом шифрования на 512 байт. В цепочке только один корневой центр: CRYPTO-PRO Test Center 2. Я поместил его в контейнер: Доверенные корневые центры сертификации. Вы не сталкивались с подобной проблемой?
Если возможно, помогите пожалуйста!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,356 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.08.2020(UTC) Сообщений: 9 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Большое спасобо, Андрей! А я и не догадывался, что это сообщение о цепочке относится к сертификату службы штампов времени. Еще раз большое спасибо!
Насчет сертификата. Не знаю, почему он так выдает. В свойствах сертификата написано: Алгоритм подписи : ГОСТ Р 34.11/34.10-2001 Алгоритм откр. кл. : ГОСТ Р 34.10-2012 512 бит (1024 бит) И когда я его заказовал, то выбирал: Cripto-Pro GOST R 34.10-2012 Criptographic Service Provider
Эта ошибка ушла! Работает!
Но вот еще напасть.
Размера буфера не хватает! Может быть подскажете опять, по старой дружбе :)))
Начиная от конца кода в предыдущем письме.
byte[] pk = Convert.FromBase64String(signature); // -------конец изменений
// Помещаем подпись в документ byte[] outc = new byte[pk.Length]; PdfDictionary dic2 = new PdfDictionary(); Array.Copy(pk, 0, outc, 0, pk.Length); dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true)); sap.Close(dic2);
myWriteLine(String.Format("Документ {0} успешно подписан на ключе {1} => {2}.", signingDoc + ".pdf", certificate.Subject, signingDoc + "_signed.pdf")); return 0;
Генерит исключение: The key /Contents is too big. Is 37760, reserved 8002
sap задаю выше:
int intCSize = 20000; Dictionary<PdfName, int> hashtable = new Dictionary<PdfName, int>(); hashtable[PdfName.CONTENTS] = intCSize * 2 + 2; sap.PreClose(hashtable);
Помогите, пожалуйста! А то голову уже сломал...
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.08.2020(UTC) Сообщений: 9 Откуда: Москва Сказал «Спасибо»: 1 раз
|
По поводу предыдущего. Вопрос снимается! В коде все правильно, и все работает. Просто я от усталости потерял внимательность. Компилировал на debug-е, а тест exe запускал релизный. Вот и выдавалась одна и та же ошибка. Я уже потом заметил, что-то размер буфера reserved не меняется, хотя я с ним и так, и эдак экспериментировал... Вот как бывает. Но теперь все ясно. Большое Спасибо!!!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2023(UTC) Сообщений: 11 Откуда: Екатеринбург Сказал(а) «Спасибо»: 4 раз
|
Автор: Новожилова Елена То есть, ни КриптоПро ЭЦП SDK, ни CAdESCOM, ни КриптоПро ЭЦП Browser plug-in вы не ставили? Без одного из этих компонентов ваш код работать не будет. Ошибка Retrieving the COM class factory for component with CLSID {94AFFFCC-6C05-4814-B123-A941105AA77F} failed due to the following error: 80040154 Класс не зарегистрирован (0x80040154 (REGDB_E_CLASSNOTREG)). воспроизводится при использовании CAPICOM в .net core приложении. При этом с CAdESCOM всё работает штатно. Interop'ы добавляю для них одинаково. В чём может быть проблема? КриптоПро ЭЦП SDK, КриптоПро ЭЦП Browser plug-in установлены.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,356 Сказал «Спасибо»: 550 раз Поблагодарили: 2217 раз в 1731 постах
|
Автор: egn.p Автор: Новожилова Елена То есть, ни КриптоПро ЭЦП SDK, ни CAdESCOM, ни КриптоПро ЭЦП Browser plug-in вы не ставили? Без одного из этих компонентов ваш код работать не будет. Ошибка Retrieving the COM class factory for component with CLSID {94AFFFCC-6C05-4814-B123-A941105AA77F} failed due to the following error: 80040154 Класс не зарегистрирован (0x80040154 (REGDB_E_CLASSNOTREG)). воспроизводится при использовании CAPICOM в .net core приложении. При этом с CAdESCOM всё работает штатно. Interop'ы добавляю для них одинаково. В чём может быть проблема? КриптоПро ЭЦП SDK, КриптоПро ЭЦП Browser plug-in установлены. CAPICOM установлен? и зачем он используется? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2023(UTC) Сообщений: 11 Откуда: Екатеринбург Сказал(а) «Спасибо»: 4 раз
|
Автор: Андрей * CAPICOM установлен? и зачем он используется? Как его установить? Я скачал dll с https://cryptopro.ru/faq/capicom-i-kriptopro-csp, попытался выполнить команду regsvr32.exe "D:\ab_prj\cryptopro-csp-api\libs\Interop.CAPICOM.dll", получил ответ: Цитата:RegSvr32 Модуль "D:\ab_prj\cryptopro-csp-api\libs\Interop.CAPICOM.dll" загружен, но точка входа DllRegisterServer не найдена. Проверьте, что "D:\ab_prj\cryptopro-csp-api\libs\Interop.CAPICOM.dll" является правильным файлом DLL или OCX и повторите попытку.
Или его надо каким-то другим способом установить? CAdESCOM я никак не устанавливал, он работает. Используется для проверки подписи формата CMS. Ошибка 80040154 Класс не зарегистрирован вылетает при создании объекта класса SignedDataClass. Код:
public void VerifyDetachedCms(byte[] signature, byte[] original)
{
var signedData = new SignedDataClass
{
Content = original
};
signedData.Verify(signature, bDetached: true);
}
UPD: библиотеки добавлены в проект: Код:<ItemGroup>
<Reference Include="Interop.CAdESCOM">
<HintPath>..\..\libs\Interop.CAdESCOM.dll</HintPath>
</Reference>
<Reference Include="Interop.CAPICOM">
<HintPath>..\..\libs\Interop.CAPICOM.dll</HintPath>
</Reference>
</ItemGroup>
Отредактировано пользователем 3 октября 2023 г. 14:20:18(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.09.2023(UTC) Сообщений: 11 Откуда: Екатеринбург Сказал(а) «Спасибо»: 4 раз
|
Удалось проверить подпись формата CMS через SignedCms: Код:public void VerifyDetachedCms(byte[] signature, byte[] original)
{
var signatureCms = new ContentInfo(signature);
var signedCms = new SignedCms(signatureCms, detached: true);
signedCms.Decode(original);
signedCms.CheckSignature(verifySignatureOnly: false);
}
Можно ли как-то усилить эту подпись до любого из форматов CAdES? Я не нашёл, как перевести данные из SignedCms в CadesSignedDataClass. Есть ли такой механизм?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close