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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline khomenko  
#11 Оставлено : 20 июня 2012 г. 15:26:08(UTC)
Михаил Хоменко

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

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

Поблагодарили: 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) загружен 384 раз(а).

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

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

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

Поблагодарили: 99 раз в 95 постах
Проверьте, получится ли создать подпись на том же самом сертификате и с той же самой службой 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)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Цитата:
Собрать лог проверки подписи в 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) загружен 268 раз(а).

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