Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
{
}
}
}
Помогите написать клиентскую часть.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.04.2017(UTC) Сообщений: 2 Откуда: Нижневартовск
|
Цитата: пример создания подписи по хэш значению в плагине.
Добрый день! Да, я пробовал создавать подпись по примеру, но у меня выдается ошибка "указан неправильный алгоритм". Когда же я меняю значение CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100 на другое, например на 0 (алгоритм SHA1), то получаю ошибку "Параметр задан неверно".
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close