Крипто про. Видимая подпись PDF

148
18 сентября 2019, 13:00

Небольшая проблема с созданием ЭЦП подписи по Госту с использование сертификата

вот код

static public class Sign
{        
    [STAThread]
    public static void Main(string[] args)
    {
        string document = "x.pdf"; 
        string certificate_dn = "nas"; 

        // Находим секретный ключ по сертификату в хранилище MY 
        X509Store store = new X509Store("My", StoreLocation.CurrentUser); 
        store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); 
        X509Certificate2Collection found = store.Certificates.Find( 
        X509FindType.FindBySubjectName, certificate_dn, true); 

        X509Certificate2 certificate = found[0]; 
        Gost3410CryptoServiceProvider cert_key = certificate.PrivateKey as Gost3410CryptoServiceProvider; 
        if (null != cert_key) 
        { 
            var cspParameters = new CspParameters(); 
            //копируем параметры csp из исходного контекста сертификата 
            cspParameters.KeyContainerName = cert_key.CspKeyContainerInfo.KeyContainerName; 
            cspParameters.ProviderType = cert_key.CspKeyContainerInfo.ProviderType; 
            cspParameters.ProviderName = cert_key.CspKeyContainerInfo.ProviderName; 
            cspParameters.Flags = cert_key.CspKeyContainerInfo.MachineKeyStore 
            ? (CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore) 
            : (CspProviderFlags.UseExistingKey); 
            cspParameters.KeyPassword = new SecureString(); 
            foreach (var c in "1") 
            { 
                cspParameters.KeyPassword.AppendChar(c); 
            } 
            //создаем новый контекст сертификат, поскольку исходный открыт readonly 
            certificate = new X509Certificate2(certificate.RawData); 
            //задаем криптопровайдер с установленным паролем 
            certificate.PrivateKey = new Gost3410CryptoServiceProvider(cspParameters); 
        } 

        PdfReader reader = new PdfReader(document); 
        PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(document + "_signed.pdf", FileMode.Create, FileAccess.Write), '\0'); 
        PdfSignatureAppearance sap = st.SignatureAppearance; 
        // Загружаем сертификат в объект iTextSharp 
        X509CertificateParser parser = new X509CertificateParser(); 
        Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[]
        { 
            parser.ReadCertificate(certificate.RawData) 
        }; 
        sap.Certificate = parser.ReadCertificate(certificate.RawData); 
        sap.Reason = "Neosign";
        sap.Location = "city"; 
        sap.Acro6Layers = true; 

        //sap.Render = PdfSignatureAppearance.SignatureRender.NameAndDescription; 
        sap.SignDate = DateTime.Now; 
        // Выбираем подходящий тип фильтра 
        PdfName filterName = new PdfName("CryptoPro PDF"); 
        // Создаем подпись 
        PdfSignature signature = new PdfSignature(filterName, PdfName.ADBE_PKCS7_DETACHED); 
        signature.Date = new PdfDate(sap.SignDate); 
        signature.Name = certificate_dn; 
        signature.Reason = sap.Reason ?? "No reason"; 
        signature.Location = sap.Location ?? "No location"; 
        sap.CryptoDictionary = signature; 
        int intCSize = 4000;
        Dictionary<PdfName, int> hashtable = new Dictionary<PdfName, int>();
        hashtable.Add(PdfName.CONTENTS, intCSize * 2 + 2);
        sap.PreClose(hashtable); 
        Stream s = sap.GetRangeStream(); 
        MemoryStream ss = new MemoryStream(); 
        int read = 0; 
        byte[] buff = new byte[8192]; 
        while ((read = s.Read(buff, 0, 8192)) > 0) 
        { 
            ss.Write(buff, 0, read); 
        } 

        // Вычисляем подпись 
        ContentInfo contentInfo = new ContentInfo(ss.ToArray()); 
        SignedCms signedCms = new SignedCms(contentInfo, true); 
        CmsSigner cmsSigner = new CmsSigner(certificate); 
        signedCms.ComputeSignature(cmsSigner, false); 
        byte[] pk = signedCms.Encode(); 

        // Помещаем подпись в документ 
        byte[] outc = new byte[intCSize]; 
        PdfDictionary dic2 = new PdfDictionary(); 
        Array.Copy(pk, 0, outc, 0, pk.Length); 
        dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true)); 

        sap.SetVisibleSignature(new Rectangle(4, 4, 4, 4), 1, "sign");

        var H = sap.Certificate.SigAlgName;
        IExternalSignature externalSignature = new X509Certificate2Signature(certificate, H); 
        MakeSignature.SignDetached(sap, externalSignature, chain, null, null, null, 0, CryptoStandard.CADES); 
        sap.Close(dic2); 
        Console.WriteLine("Document {0} success sign om key {1} => {2}.", 
        document, certificate.Subject, document + "_signed.pdf"); 
        Console.ReadKey(); 
    }
}

Вот скрин ошибка

Что за key не понятно Кто имел дело с подобным как пофиксить. Если брать сертификат не по Госту то все ок. SDK от крипто про стоит. Невидимая подпись этим же кодом ставится.

using System;
   using System.Collections.Generic;
   using System.Security;
   using System.Security.Cryptography;
   using System.Security.Cryptography.X509Certificates;
   using iTextSharp.text;
    //#if PDF_SIGNATURE_ENABLED
    namespace Simple35.Pdf
    {
        using CryptoPro.Sharpei;
        using iTextSharp.text.pdf;
        using iTextSharp.text.pdf.security;
        using Org.BouncyCastle.X509;
        using System.IO;
        using System.Security.Cryptography.Pkcs;
        public class Program
        {
            /// code
        }
    }
READ ALSO
Не меняются параметры из php.ini

Не меняются параметры из php.ini

суть проблемы в том, что пытаюсь изменить файл phpini

134
Изменение размера картинки при загрузке на php (не могу настроить корректно)

Изменение размера картинки при загрузке на php (не могу настроить корректно)

Добрый день! Помогите сделать одну штуку! Есть уменьшение размера картинки , точнее исходный размер $final_width_of_image = 1600;

189
Шифрованая строка в php и java отличается

Шифрованая строка в php и java отличается

Шифрую одну и туже строку одним и тем же ключем в пхп и ява на выходе получается разная строкаПодскажите в чем у меня ошибка?

130