Автор: Андрей * 
Автор: knik85 
Может ли плагин криптопро подписывать документы как криптопроPDF?
подписывается вычисленный хеш,
задача бэка - правильно подготовить pdf, а потом вставить отсоединенную ЭП полученную с клиента (от плагина или другого ПО) и получить в итоге pdf с встроенной ЭП (PAdES).
using com.itextpdf.text.pdf.security;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using System;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
class Program
{
static void Main(string[] args)
{
string inputPdf = "C:\\Тест подписи.pdf"; // Исходный PDF
string outputPdf = "C:\\Тест подписи_signed.pdf"; // Подписанный PDF
string outputPdf_2 = "C:\\Тест подписи_signed_2.pdf"; // Подписанный PDF
string hashFile = "C:\\Тест подписи.hash"; // Файл хеша
string signatureFile = "C:\\Тест подписи.hash.sign"; // Подпись от CryptoPro
byte[] hash = PrepareSignatureAndGetHash(inputPdf, outputPdf);
File.WriteAllBytes(hashFile, hash);
//Хеш(в виде текстового файла) подписывается в криптопро и далее выполнение кода продолжается
Console.ReadLine();
byte[] sig = Convert.FromBase64String(File.ReadAllText(signatureFile));
SigSignature(outputPdf, outputPdf_2, sig);
}
// Function to get the hash for the signature
static byte[] PrepareSignatureAndGetHash(string inputPdf, string outputPdf)
{
var hash = string.Empty;
using (var reader = new PdfReader(inputPdf))
{
using (var fileStream = File.OpenWrite(outputPdf))
{
using (var stamper = PdfStamper.CreateSignature(reader, fileStream, '0', null, true))
{
var signatureAppearance = stamper.SignatureAppearance;
signatureAppearance.SetVisibleSignature(new iTextSharp.text.Rectangle(100, 100, 200, 200), 1, "NewSignature");
PdfName filterName = new PdfName("CryptoPro PDF");
IExternalSignatureContainer external = new ExternalBlankSignatureContainer(filterName, PdfName.ADBE_PKCS7_DETACHED);
signatureAppearance.Reason = "Подпись Тест";
signatureAppearance.Layer2Text = "Подпись Тест";
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
MakeSignature.SignExternalContainer(signatureAppearance, external, 8192);
byte[] buff = DigestAlgorithms.Digest(signatureAppearance.GetRangeStream(), "SHA256");
//Stream s = signatureAppearance.GetRangeStream();
//MemoryStream ss = new MemoryStream();
//int read = 0;
//while ((read = s.Read(buff, 0, 8192)) > 0)
//{
// ss.Write(buff, 0, read);
//}
return buff;
}
}
}
}
// Function to apply the external signature to the PDF
static void SigSignature(string inputPdf, string outputPdf, byte[] sig)
{
using (var reader = new PdfReader(inputPdf))
{
using (var fileStream = File.OpenWrite(outputPdf))
{
IExternalSignatureContainer external = new MfuaExternalSignatureContainer(sig);
MakeSignature.SignDeferred(reader, "NewSignature", fileStream, external);
}
}
}
// Custom implementation of IExternalSignatureContainer
class MfuaExternalSignatureContainer : IExternalSignatureContainer
{
private readonly byte[] _signedBytes;
public MfuaExternalSignatureContainer(byte[] signedBytes)
{
_signedBytes = signedBytes;
}
public byte[] Sign(Stream data)
{
return _signedBytes; // Returning pre-signed bytes
}
public void ModifySigningDictionary(PdfDictionary signDic)
{
// signDic.Put(PdfName.FILTER, new PdfName("CryptoPro PDF"));
}
}
}
1. Подготавливаю файл и выгружаю хеш
2. Подписываю хеш в криптопро
3. Вставляю подпись
Ошибки:
подпись не определена;
документ был изменён;
сертификат определяет, но пишет, что ненадёжный.
Отредактировано пользователем 14 февраля 2025 г. 16:41:14(UTC)
| Причина: Не указана