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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Shavadre  
#1 Оставлено : 13 апреля 2017 г. 10:45:16(UTC)
Shavadre

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

Группы: Участники
Зарегистрирован: 13.04.2017(UTC)
Сообщений: 2
Российская Федерация
Откуда: Нижневартовск

Доброго времени суток, форумчане!
Передо мной поставили задачу реализовать цифровую подпись PDF "одной кнопкой" в браузере. Почитав по теме, я решил реализовать так:
1) на сервере формируется PDF-файл;
2) через iTextSharp (пишу на C#) добавляю поле для подписи во временный файл;
3) произвожу подсчет хэша временного файла и отправляю клиенту;
4) на клиенте через cadesplugin_api подписываю получившуюся строку (массив байт) и отправляю обратно на сервер;
5) на сервере получившуюся подпись прикрепляю в поле для подписи и сохраняю уже подписанный файл в нужное мне место.

Серверную часть я с горем пополам написал:
Код:

public partial class Default : System.Web.UI.Page
    {
        private const string UnsngnedPdf = @"C:\Users\vrshaikhislamov\Documents\esign\request.pdf";
        private const string TempPdf = @"C:\Users\vrshaikhislamov\Documents\esign\request_temp.pdf";
        private const string SignedPdf = @"C:\Users\vrshaikhislamov\Documents\esign\request_signed.pdf";
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(eSign.InnerHtml))
            {
                EmbedSignature(TempPdf, SignedPdf, "Sign", Encoding.ASCII.GetBytes(eSign.InnerHtml));
            }
            bytesFromPdf.InnerHtml = Convert.ToBase64String(GetBytesToSign(UnsngnedPdf, TempPdf, "Sign"));
        }

        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(200, 50, 0, 0), 1, signatureFieldName);
                    IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKMS, PdfName.ADBE_X509_RSA_SHA1);
                    MakeSignature.SignExternalContainer(appearance, external, 8192);

                    return SHA1.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);
                }
            }
        }

        private class MyExternalSignatureContainer : IExternalSignatureContainer
        {
            private readonly byte[] _signedBytes;

            public MyExternalSignatureContainer(byte[] signedBytes)
            {
                this._signedBytes = signedBytes;
            }

            public byte[] Sign(Stream data)
            {
                return _signedBytes;
            }

            public void ModifySigningDictionary(PdfDictionary signDic)
            {
            }
        }
    }


Помогите написать клиентскую часть.
Offline cross  
#2 Оставлено : 13 апреля 2017 г. 15:01:57(UTC)
Анатолий Беляев

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
http://cpdn.cryptopro.ru...mples-raw-signature.html
пример создания подписи по хэш значению в плагине.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline Shavadre  
#3 Оставлено : 14 апреля 2017 г. 8:44:47(UTC)
Shavadre

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

Группы: Участники
Зарегистрирован: 13.04.2017(UTC)
Сообщений: 2
Российская Федерация
Откуда: Нижневартовск

Цитата:

пример создания подписи по хэш значению в плагине.


Добрый день! Да, я пробовал создавать подпись по примеру, но у меня выдается ошибка "указан неправильный алгоритм". Когда же я меняю значение CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100 на другое, например на 0 (алгоритм SHA1), то получаю ошибку "Параметр задан неверно".
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.