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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline avorobev  
#1 Оставлено : 18 июня 2012 г. 14:59:21(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Добрый день!

У меня стоит задача подписывать PDF документы с помощью УЭЦП. Разработка ведется на .NET. Как подписать PDF документ простой подписью, я нашел в примерах КриптоПро .NET. Собственно там это делается даже не с помощью КриптоПро .NET, а с помощью iTextSharp. Но как подписать PDF с помощью УЭЦП? Как работать с TSP и OCSP? Есть ли где-то примеры, как это сделать на .NET? Буду благодарен за любую помощь.

С уважением,
Александр
Offline avorobev  
#2 Оставлено : 19 июня 2012 г. 13:51:31(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Ладно, пока ответов нет, продолжу в одностороннем порядке. :)

В iTextSharp есть примеры, как подписать PDF с помощью УЭЦП.
http://itextpdf.sourceforge.net/howtosign.html#signtsocspcs

Но, к сожалению, iTextSharp умеет работать только с RSA и DSA криптопровайдерами. Можно конечно попытаться написать свои аналогичные классы для работы с криптопровайдером Gost3410, но и тут есть свои препятствия. Например, в одном из мест iTextSharp хочет получить параметры криптопровайдера для закрытого ключа. Но метод Gost3410CryptoServiceProvider.ExportParameters(true) возвращает exception:

System.Security.Cryptography.CryptographicException was unhandled by user code
Message=Bulk user key export from CSP is not supported.
Source=CryptoPro.Sharpei.Base


Так что данный путь, видимо, не приведет к успеху.

Отредактировано пользователем 19 июня 2012 г. 14:10:21(UTC)  | Причина: Не указана

Offline avorobev  
#3 Оставлено : 19 июня 2012 г. 13:59:02(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Второй вариант - это взять пример подписи PDF простой подписью из примеров КриптоПро .NET (\simple35\Pdf\Sign.cs). Но попробовать заменить блок кода

Код:
ContentInfo contentInfo = new ContentInfo(ss.ToArray());
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner, false);
byte[] pk = signedCms.Encode();

на вычисление УЭЦП с помощью COM библиотеки cadescom.dll.
И там тоже, как я понимаю, будут свои подводные камни. Но более важный вопрос, будет ли это вообще работать? Является ли такой подход правильным? Будет ли создана при этом УЭЦП и будет ли PDF правильно ею подписан? Ведь PDF должен быть подписан по стандарту PAdES, который является некоей комбинацией CAdES и XAdES применительно к PDF.

Отредактировано пользователем 19 июня 2012 г. 14:03:44(UTC)  | Причина: Не указана

Offline avorobev  
#4 Оставлено : 19 июня 2012 г. 14:05:12(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

А вообще закономерный вопрос: почему в КриптоПро .NET нет никаких классов для работы с УЭЦП?
Или почему то, что уже сделано вами в продукте КриптоПро PDF нельзя оформить как библиотеку для разработчиков?

Отредактировано пользователем 19 июня 2012 г. 14:54:39(UTC)  | Причина: Не указана

Offline khomenko  
#5 Оставлено : 19 июня 2012 г. 15:47:58(UTC)
Михаил Хоменко

Статус: Активный участник

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

Поблагодарили: 15 раз в 14 постах
Добрый день,
Специалист занимающийся PDF сейчас в отпуске, сможет ответить в среду-чертверг.

В КриптоПро .NET специальные классы для работы с УЭЦП были бы избыточны.
Работа с УЭЦП реализована через COM объекты (библиотека cadescom.dll), с которыми .NET умеет общаться.
Offline avorobev  
#6 Оставлено : 19 июня 2012 г. 16:05:44(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

khomenko написал:
Специалист занимающийся PDF сейчас в отпуске, сможет ответить в среду-чертверг.

Ну что ж, придется подождать. Для нас это важный вопрос.

khomenko написал:
В КриптоПро .NET специальные классы для работы с УЭЦП были бы избыточны.
Работа с УЭЦП реализована через COM объекты (библиотека cadescom.dll), с которыми .NET умеет общаться.

Ну как Вам сказать, это было бы просто намного удобнее, чем работать с COM объектами. Да и функционал имеющихся у вас C/C++ библиотек намного обширней, чем COM. Тем более, что подобных вопросов у вас на форуме десятки. И во всех говориться, что для .NET у вас ничего такого нет. А вопрос подписания PDF с помощью УЭЦП становится все более актуальным для многих компаний, которые внедряют электронный документооборот. Я имею в виду вопрос программного подписания, а не ручного с помощью КриптоПро PDF.

Спасибо за ответы. Про cadescom.dll пойду спрашивать в другую ветку.



Отредактировано пользователем 19 июня 2012 г. 17:40:52(UTC)  | Причина: Не указана

Offline khomenko  
#7 Оставлено : 20 июня 2012 г. 13:08:35(UTC)
Михаил Хоменко

Статус: Активный участник

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

Поблагодарили: 15 раз в 14 постах
Создать УЭЦП под PDF можно с помощью библиотеки cadescom.
Достаточно заменить создание подписи через SignedCms, на создание
открепленной подписи через объекты cadescom. В остальном пример (\simple35\Pdf\Sign.cs)
остается без изменений. Подводных камней быть не должно :)

Для использования нативных вызовов есть PInvoke.
Если в КриптоПро .NET делать обертки над нативным cades, придется затащить и весь advapi, crypt32 и т.д., встают вопросы размера дистрибутива, целесообразности, полноты и т.п
А так разработчик сам выбирает минимальный, необходимый набор функций, структур и пр. и реализует в своём приложении.
Offline Павел Смирнов  
#8 Оставлено : 20 июня 2012 г. 13:24:02(UTC)
Павел Смирнов

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
avorobev написал:
Да и функционал имеющихся у вас C/C++ библиотек намного обширней, чем COM.

Уговорите MS расширить возможности подписей формата CMS в .NET до уровня того, что можно сделать через CryptoAPI, а там и мы подтянемся. :)
Техническую поддержку оказываем тут.
Наша база знаний.
Offline avorobev  
#9 Оставлено : 20 июня 2012 г. 13:30:59(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Смирнов написал:
avorobev написал:
Да и функционал имеющихся у вас C/C++ библиотек намного обширней, чем COM.

Уговорите MS расширить возможности подписей формата CMS в .NET до уровня того, что можно сделать через CryptoAPI, а там и мы подтянемся. :)

:))
Offline avorobev  
#10 Оставлено : 20 июня 2012 г. 13:34:27(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

khomenko написал:
Создать УЭЦП под PDF можно с помощью библиотеки cadescom.
Достаточно заменить создание подписи через SignedCms, на создание
открепленной подписи через объекты cadescom. В остальном пример (\simple35\Pdf\Sign.cs)
остается без изменений. Подводных камней быть не должно :)

Спасибо за ответ. В этом направлении я и иду.

Будет ли достаточно использовать код из примера 1?
http://cpdn.cryptopro.ru...escomsamplesigndata.html

И еще вопрос в том, будет ли это полностью соответствовать стандарту PAdES? Будет ли это аналогом усовершенствованной подписи, сделанной вручную с помощью КриптоПро PDF?

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

Offline khomenko  
#11 Оставлено : 20 июня 2012 г. 15:26:08(UTC)
Михаил Хоменко

Статус: Активный участник

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

Поблагодарили: 15 раз в 14 постах
Кода из примера будет достаточно, единственно нужно изменить
Код:

sSignedData = oSignedData.Sign(oSigner, False)

на
Код:

sSignedData = oSignedData.Sign(oSigner, True)

для создания открепленной подписи.

Интеропы для CADESCOM можно взять здесь

Подпись будет аналогична созданной вручную через КриптоПро PDF.
Offline avorobev  
#12 Оставлено : 20 июня 2012 г. 15:52:06(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Спасибо большое за ответы!
Offline avorobev  
#13 Оставлено : 22 июня 2012 г. 16:13:28(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

К сожалению, так просто это не заработало. Вот пример моего кода. Он практически аналогичем примеру \simple35\Pdf\Sign.cs. Но вычисление подписи через SignedCms заменено на вычисление подписи через cadescom.
Код:
            MemoryStream signedPdfStream = new MemoryStream();

            PdfReader reader = new PdfReader(sourcePdf);
            PdfStamper st = PdfStamper.CreateSignature(reader, signedPdfStream, '\0');

            // Загружаем сертификат в объект iTextSharp
            X509CertificateParser parser = new X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { 
                parser.ReadCertificate(certificate.RawData)
            };

            // Задаем параметры подписи
            PdfSignatureAppearance sap = st.SignatureAppearance;
            sap.SetCrypto(null, chain, null, null);
            sap.SignDate = DateTime.Now;
            sap.Reason = pdfSignatureParameters.SignatureReason;
            sap.Location = pdfSignatureParameters.SignatureLocation;
            sap.Contact = pdfSignatureParameters.SignerContact;
            sap.Acro6Layers = true;
            sap.Render = PdfSignatureAppearance.SignatureRender.Description;

            // Создаем подпись
            PdfName filterName = new PdfName("CryptoPro PDF");
            PdfSignature dic = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED);
            dic.Date = new PdfDate(sap.SignDate);
            dic.Name = PdfPKCS7.GetSubjectFields(chain[0]).GetField("CN");
            if (sap.Reason != null)
                dic.Reason = sap.Reason;
            if (sap.Location != null)
                dic.Location = sap.Location;
            if (sap.Contact != null)
                dic.Contact = sap.Contact;
            sap.CryptoDictionary = dic;

            int intCSize = 15000;
            Dictionary<PdfName, int> hashtable = new Dictionary<PdfName, int>();
            hashtable[PdfName.CONTENTS] = intCSize * 2 + 2;
            sap.PreClose(hashtable);
            Stream s = sap.GetRangeStream();
            MemoryStream ss = new MemoryStream();
            int read = 0;
            byte[] buff = new byte[8192];
            while ((read = s.Read(buff, 0, 8192)) > 0)
            {
                ss.Write(buff, 0, read);
            }

            // Вычисляем подпись
            CPSigner cps = new CPSigner();
            cps.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
            cps.Certificate = GetSignerCertificate(certificate.Thumbprint);
            cps.TSAAddress = @"http://www.cryptopro.ru/tsp/tsp.srf";
            CadesSignedData csd = new CadesSignedData();
            csd.Content = ss.ToArray();
            byte[] pk = csd.Sign(cps, true);

            // Помещаем подпись в документ
            byte[] outc = new byte[intCSize];
            PdfDictionary dic2 = new PdfDictionary();
            Array.Copy(pk, 0, outc, 0, pk.Length);
            dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true));
            sap.Close(dic2);

Однако, при открытии подписанного документа в Adobe Reader с установленным КриптоПро PDF, подпись не валидируется. И в свойствах подписи сертификат также не показывается. В чем тут может быть дело?

Отредактировано пользователем 28 июня 2012 г. 16:12:14(UTC)  | Причина: Не указана

Пользователь avorobev прикрепил следующие файлы:
cadescom1.png (9kb) загружен 380 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Новожилова Елена  
#14 Оставлено : 22 июня 2012 г. 17:48:44(UTC)
Новожилова Елена

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

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

Поблагодарили: 85 раз в 82 постах
Проверьте, получится ли создать подпись на том же самом сертификате и с той же самой службой TSP при помощи скрипта, как показано в примерах:
http://cpdn.cryptopro.ru...escomsamplesigndata.html - создание, рекомендую пример номер 2
http://cpdn.cryptopro.ru...pleverifysigneddata.html - проверка.

Соберите лог проверки подписи в Adobe Acrobat, как описано здесь - http://www.cryptopro.ru/....aspx?g=posts&t=4577

Offline avorobev  
#15 Оставлено : 22 июня 2012 г. 21:20:27(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Выполнил скрипт
Код:

Option Explicit
 Const CAPICOM_CURRENT_USER_STORE = 2
 Const CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1
 Const CAPICOM_ENCODE_ANY = -1
 Const CAPICOM_ENCODE_BASE64 = 0
 Const CAPICOM_ENCODE_BINARY = 1

 Dim oSigner
 Set oSigner = CreateObject("CAdESCOM.CPSigner")
 ' Укажите правильный серийный номер сертификата.
 Dim sSerialNumber : sSerialNumber = "12730E7A00020002125F"
 ' Укажите правильный адрес службы штампов времени.
 Dim sTSAAddress : sTSAAddress = "http://www.cryptopro.ru/tsp/tsp.srf"
 
 oSigner.Certificate = GetSignerCertificate(sSerialNumber)
 oSigner.TSAAddress = sTSAAddress
 oSigner.Options = CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
 
 Dim oSignedData
 Set oSignedData = CreateObject("CAdESCOM.CadesSignedData")
 oSignedData.Content = LoadFile("test.dat")
 Dim sSignedData
 sSignedData = oSignedData.Sign(oSigner, True)

 Dim oSignedData2
 Set oSignedData2 = CreateObject("CAdESCOM.CadesSignedData")
 oSignedData2.Content = LoadFile("test.dat")
 oSignedData2.Verify sSignedData, True


На последней строчке проверки получил ошибку
Цитата:
CAdESCOM.CadesSignedData.1: The hash value is not correct.



Собрать лог проверки подписи в Adobe Reader не получилось. При открытии нормального подписаного простой подписью PDF файла лог пишется. При открытии файла, подписанного приведенным выше кодом УЭЦП подписи, никакой лог вообще не пишется. Я думаю, что Adobe Reader вообще не может распознать эту подпись как подпись и поэтому даже не вызывает КриптоПро PDF.

Отредактировано пользователем 28 июня 2012 г. 16:14:29(UTC)  | Причина: Не указана

Offline avorobev  
#16 Оставлено : 22 июня 2012 г. 21:26:58(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Кстати, код, аналогичный скрипту, но выполненный в .NET, никаких ошибок не выдал :(
Код:

            CPSigner cps = new CPSigner();
            cps.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
            cps.Certificate = GetSignerCertificate(certificate.Thumbprint);
            cps.TSAAddress = @"http://www.cryptopro.ru/tsp/tsp.srf";

            CadesSignedData csd = new CadesSignedData();
            csd.Content = ss.ToArray();
            byte[] pk = csd.Sign(cps, true);

            csd = new CadesSignedData();
            csd.Content = ss.ToArray();
            csd.Verify(pk, true);

Отредактировано пользователем 28 июня 2012 г. 16:13:43(UTC)  | Причина: Не указана

Offline avorobev  
#17 Оставлено : 26 июня 2012 г. 21:57:09(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Так кто-нибудь может подсказать, в чем у тут проблема и как это исправить?
Offline Новожилова Елена  
#18 Оставлено : 27 июня 2012 г. 16:04:59(UTC)
Новожилова Елена

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

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

Поблагодарили: 85 раз в 82 постах
Цитата:
Собрать лог проверки подписи в Adobe Reader не получилось. При открытии нормального подписаного простой подписью PDF файла лог пишется. При открытии файла, подписанного приведенным выше кодом УЭЦП подписи, никакой лог вообще не пишется. Я думаю, что Adobe Reader вообще не может распознать эту подпись как подпись и поэтому даже не вызывает КриптоПро PDF.


Дело скорее в том, что он не знает, что эту подпись нужно проверять при помощи КриптоПро PDF и пытается проверить стандартными средствами.
Что указано в Adobe Reader в качестве метода проверки подписи? (Edit->Preferences->Security->Advanced Preferences->Verification).

Попробуйте указать Default method = CryptoPro PDF и отметьте пункт "Всегда использовать метод по умолчанию"
Offline avorobev  
#19 Оставлено : 27 июня 2012 г. 23:05:10(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Новожилова Елена написал:
Попробуйте указать Default method = CryptoPro PDF и отметьте пункт "Всегда использовать метод по умолчанию"

Попробовал, не помогло. Никаких логов не пишется.

Если подписать документ вручную с УЭЦП с помощью КриптоПро PDF, то при его открытии лог пишется. Если подписать в коде программы, то нет.

Отредактировано пользователем 28 июня 2012 г. 16:57:37(UTC)  | Причина: Не указана

Offline avorobev  
#20 Оставлено : 30 июля 2012 г. 22:57:30(UTC)
avorobev

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.04.2012(UTC)
Сообщений: 109

Добрый день! Задача по прежнему не решена.

Используются следующие версии ПО:
Windows 7 Professional 32-bit
Visual Studio 2010
.NET Framework 4.0
КриптоПро CSP 3.6 R2 (3.6.6497)
КриптоПро .NET 1.0.4583.3
CADESCOM из КриптоПро ЭЦП SDK 1.05.0970 (интеропы взяты отсюда)
iTextSharp 5.2.1 пропатченный для КриптоПро

Вот код, который я выполняю.
Код:

        // Подписываем PDF документ
        public byte[] SignPdf(byte[] sourcePdf, X509Certificate2 certificate)
        {
            MemoryStream signedPdfStream = new MemoryStream();

            PdfReader reader = new PdfReader(sourcePdf);
            PdfStamper stamper = PdfStamper.CreateSignature(reader, signedPdfStream, '\0');

            // загружаем сертификат в объект iTextSharp
            X509CertificateParser parser = new X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { 
                parser.ReadCertificate(certificate.RawData)
            };

            // задаем параметры подписи
            PdfName filterName = new PdfName("CryptoPro PDF");
            PdfSignatureAppearance sap = stamper.SignatureAppearance;
            sap.SetCrypto(null, chain, null, filterName);
            sap.SignDate = DateTime.Now;
            sap.Reason = "I like to sign";
            sap.Location = PdfPKCS7.GetSubjectFields(chain[0]).GetField("L") + ", " + PdfPKCS7.GetSubjectFields(chain[0]).GetField("C");
            sap.Contact = PdfPKCS7.GetSubjectFields(chain[0]).GetField("CN") + " <" + PdfPKCS7.GetSubjectFields(chain[0]).GetField("E") + ">";
            sap.Acro6Layers = true;
            sap.Render = PdfSignatureAppearance.SignatureRender.NameAndDescription;

            // создаем подпись
            PdfSignature pdfSignature = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED);
            pdfSignature.Date = new PdfDate(sap.SignDate);
            pdfSignature.Name = PdfPKCS7.GetSubjectFields(chain[0]).GetField("CN");
            pdfSignature.Reason = sap.Reason;
            pdfSignature.Location = sap.Location;
            pdfSignature.Contact = sap.Contact;
            sap.CryptoDictionary = pdfSignature;

            // задаем размер буфера подписи
            int intCSize = 40000;
            Dictionary<PdfName, int> hashtable = new Dictionary<PdfName, int>();
            hashtable[PdfName.CONTENTS] = intCSize * 2 + 2;
            sap.PreClose(hashtable);

            // получаем и копируем контент
            Stream rangeStream = sap.GetRangeStream();
            MemoryStream contentStream = new MemoryStream();
            rangeStream.CopyTo(contentStream);
            byte[] content = contentStream.ToArray();

            // вычисляем подпись
            //byte[] signature = SignWithSimpleEDS(content, certificate);  // - вызывается создание обычной подпись
            byte[] signature = SignWithAdvancedEDS(content, certificate);  // - вызывается создание УЭЦП

            // помещаем подпись в документ
            byte[] signBuff = new byte[intCSize];
            Array.Copy(signature, 0, signBuff, 0, signature.Length);
            PdfDictionary dictionary = new PdfDictionary();
            dictionary.Put(PdfName.CONTENTS, new PdfString(signBuff).SetHexWriting(true));
            sap.Close(dictionary);

            byte[] signedPdf = signedPdfStream.ToArray();
            return signedPdf;
        }

        // Вычисляем обычную ЭЦП
        public static byte[] SignWithSimpleEDS(byte[] content, X509Certificate2 certificate)
        {
            byte[] signature = null;

            try
            {
                ContentInfo contentInfo = new ContentInfo(content);
                SignedCms signedCms = new SignedCms(contentInfo, true);
                CmsSigner cmsSigner = new CmsSigner(certificate);
                cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
                signedCms.ComputeSignature(cmsSigner, true);
                signature = signedCms.Encode();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return signature;
        }

        // Вычисляем УЭЦП
        public static byte[] SignWithAdvancedEDS(byte[] content, X509Certificate2 certificate)
        {
            byte[] signature = null;

            try
            {
                string tspServerAddress = @"http://www.cryptopro.ru/tsp/tsp.srf";

                CPSigner cps = new CPSigner();
                cps.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
                cps.Certificate = GetCAPICOMCertificate(certificate.Thumbprint);
                cps.TSAAddress = tspServerAddress;
                CadesSignedData csd = new CadesSignedData();
                csd.Content = content;
                signature = csd.Sign(cps, true);

                // тестовая проверка подписи
                CadesSignedData csd2 = new CadesSignedData();
                csd2.Content = content;
                csd2.Verify(signature, true);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return signature;
        }

        // Ищем сертификат
        public static ICertificate GetCAPICOMCertificate(string certificateThumbprint)
        {
            ICertificate cert = null;

            certificateThumbprint = certificateThumbprint.Replace(" ", "").ToUpper();

            string storeName = "My";
            CAPICOM_STORE_LOCATION storeLocation = CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE;

            try
            {
                Store sto = new Store();
                sto.Open(storeLocation, storeName, CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY);
                foreach (ICertificate c in sto.Certificates)
                {
                    if ((c.Thumbprint == certificateThumbprint) && (c.HasPrivateKey()) && (c.IsValid().Result))
                    {
                        cert = c;
                        break;
                    }
                }
                sto.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return cert;
        }


Если я использую метод SignWithSimpleEDS(), то есть подписываю PDF обычной подписью, то все в порядке. Но если я использую метод SignWithAdvancedEDS(), то есть подписываю PDF с помощтю УЭЦП, то подпись не распознается. Adobe Reader пишет об ошибке подписи (см. скриншот). Если в Adobe Reader принудительно нажать "Validate Signature", то получаю следующий лог валидации:
Цитата:

Error during signature verification.
ASN.1 parsing error:
Error encountered while BER decoding:


С помощью dbgView лог также собрать не удалось. Если подпись обычная или если подписывается УЭЦП вручную с помощью КриптоПро PDF в Adobe Reader, то лог пишется. Если подписывать PDF с УЭЦП программно приведенным выше кодом, то нет.

Могу предположить, что сама подпись вычисляется нормально (так как в коде есть ее валидация), но вот в PDF вставляется как-то странно. Поэтому Adobe Reader ее не распознает и не хочет или не может провалидировать. То есть, до вызова библиотек КриптоПро дело даже не доходит.

Настоятельно прошу помощи в решении данной задачи. Она для нас очень важна и приоритетна. Все лицензии у нас есть, в том числе годовая техническая поддержка.

Отредактировано пользователем 30 июля 2012 г. 23:12:06(UTC)  | Причина: Не указана

Пользователь avorobev прикрепил следующие файлы:
cadescom2.png (18kb) загружен 265 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.