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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline h254154  
#1 Оставлено : 16 сентября 2016 г. 11:09:49(UTC)
h254154

Статус: Новичок

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

Имеется работающее клиент-серверное приложение на C# без КриптоПро для подписи PDF. Клиент загружает на сервер неподписанный PDF, сервер через iTextSharp считает от него хэш, передает на клиент, клиент пордписывает хэш и сервер вставляет подпись в PDF.
Вот код методов расчета хэша и вставки подписи на сервере:
Код:
public static byte[] GetBytesToSign(string unsignedPdf, string tempPdf, string signatureFieldName)
{
    using (PdfReader reader = new PdfReader(unsignedPdf))
    {
        using (FileStream os = File.OpenWrite(tempPdf))
        {
            PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0');
            PdfSignatureAppearance appearance = stamper.SignatureAppearance;
            appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, signatureFieldName);
            IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
            MakeSignature.SignExternalContainer(appearance, external, 8192);

            return SHA1Managed.Create().ComputeHash(appearance.GetRangeStream());
        }
    }
}
public static void EmbedSignature(string tempPdf, string signedPdf, string signatureFieldName, byte[] signedBytes)
{
    using (PdfReader reader = new PdfReader(tempPdf))
    {
        using (FileStream os = File.OpenWrite(signedPdf))
        {
            IExternalSignatureContainer external = new MyExternalSignatureContainer(signedBytes);
            MakeSignature.SignDeferred(reader, signatureFieldName, os, external);
        }
    }
}

На клиенте подпись делается стандартными средствами через p12-сертификат:
Код:
protected static byte[] SignData(byte[] bytesToSign, string certFileName, string certPass)
{
	ContentInfo contentInfo = new ContentInfo(bytesToSign);
	SignedCms signedCms = new SignedCms(contentInfo, false);
	signedCms.ComputeSignature(new CmsSigner(new X509Certificate2(certFileName, certPass)), false);
	return signedCms.Encode();
}

Теперь нужно реализовать второй браузерный клиент, который будет подписывать хэш через brower plugin КриптоПро. Пробовал на клиенте вот такой код (для IE):
Код:
var CPSigner = new ActiveXObject('CAdESCOM.CPSigner');
CPSigner.Certificate = cert;
var SignedData = new ActiveXObject('CAdESCOM.CadesSignedData');
SignedData.ContentEncoding =  0x01 /*CADESCOM_BASE64_TO_BINARY*/;
SignedData.Content = bytesToSignBase64;
return SignedData.SignCades(CPSigner, 0x01, false);

Но сгенерированная подпись не распознается AdobeReader-ом, вылезает ошибка формата подписи.
Подскажите, какой будет правильный клиентский код для подписи хэша? И нужно ли менять что-то в имеющихся серверных методах?

Отредактировано пользователем 16 сентября 2016 г. 16:14:04(UTC)  | Причина: Не указана

Offline cross  
#2 Оставлено : 22 сентября 2016 г. 8:29:19(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Плагин не поддерживает создание PDF подписи через API. Если очень нужно то можно реализовать схему когда на сервере считается хеш от документа и передается на клиент. На клиенте в браузере используя CadesSignHash подписывается присланный хеш. Далее на сервере используя iText подпись вставляется в PDF подпись
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline h254154  
#3 Оставлено : 23 сентября 2016 г. 11:39:31(UTC)
h254154

Статус: Новичок

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

Автор: cross Перейти к цитате
Если очень нужно то можно реализовать схему когда на сервере считается хеш от документа и передается на клиент. На клиенте в браузере используя CadesSignHash подписывается присланный хеш. Далее на сервере используя iText подпись вставляется в PDF подпись


Почитайте внимательно вопрос. Я именно эту схему и пытаюсь сделать, но всталенная подпись не распознается AdobeReader-ом. Вопрос в том, что нужно изменить в имеющемся коде, чтобы она распознавалась.

Отредактировано пользователем 23 сентября 2016 г. 11:42:55(UTC)  | Причина: Не указана

Offline Павел Смирнов  
#4 Оставлено : 23 сентября 2016 г. 11:42:07(UTC)
Павел Смирнов

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Почитайте внимательно ответ. Вместо SignCades нужно использовать SignHash.
Техническую поддержку оказываем тут.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.