Автор: Андрей * 
Автор: 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)
 | Причина: Не указана