Небольшая проблема с созданием ЭЦП подписи по Госту с использование сертификата
вот код
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
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый день! Помогите сделать одну штуку! Есть уменьшение размера картинки , точнее исходный размер $final_width_of_image = 1600;
Шифрую одну и туже строку одним и тем же ключем в пхп и ява на выходе получается разная строкаПодскажите в чем у меня ошибка?