Статус: Новичок
Группы: Участники
Зарегистрирован: 16.09.2016(UTC) Сообщений: 2
|
Имеется работающее клиент-серверное приложение на C# без КриптоПро для подписи PDF. Клиент загружает на сервер неподписанный PDF, сервер через iTextSharp считает от него хэш, передает на клиент, клиент пордписывает хэш и сервер вставляет подпись в PDF. Вот код методов расчета хэша и вставки подписи на сервере: Код: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(36, 748, 144, 780), 1, signatureFieldName);
IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
MakeSignature.SignExternalContainer(appearance, external, 8192);
return SHA1Managed.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);
}
}
}
На клиенте подпись делается стандартными средствами через p12-сертификат: Код:protected static byte[] SignData(byte[] bytesToSign, string certFileName, string certPass)
{
ContentInfo contentInfo = new ContentInfo(bytesToSign);
SignedCms signedCms = new SignedCms(contentInfo, false);
signedCms.ComputeSignature(new CmsSigner(new X509Certificate2(certFileName, certPass)), false);
return signedCms.Encode();
}
Теперь нужно реализовать второй браузерный клиент, который будет подписывать хэш через brower plugin КриптоПро. Пробовал на клиенте вот такой код (для IE): Код:var CPSigner = new ActiveXObject('CAdESCOM.CPSigner');
CPSigner.Certificate = cert;
var SignedData = new ActiveXObject('CAdESCOM.CadesSignedData');
SignedData.ContentEncoding = 0x01 /*CADESCOM_BASE64_TO_BINARY*/;
SignedData.Content = bytesToSignBase64;
return SignedData.SignCades(CPSigner, 0x01, false);
Но сгенерированная подпись не распознается AdobeReader-ом, вылезает ошибка формата подписи. Подскажите, какой будет правильный клиентский код для подписи хэша? И нужно ли менять что-то в имеющихся серверных методах? Отредактировано пользователем 16 сентября 2016 г. 16:14:04(UTC)
| Причина: Не указана
|