Статус: Новичок
Группы: Участники
Зарегистрирован: 13.05.2016(UTC) Сообщений: 3 Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Доброго времени суток. Есть PDF на стороне сервера (ASP.Net MVC). Необходимо реализовать подпись PDF файлов, при этом есть загвоздка - PDF формируется на стороне сервера, но подпись может производить только клиент. Для этого я пытаюсь реализовать т. н. отложенную подпись, которую поддерживает iTextSharp. Шаги: 1) Формируется PDF с пустой подписью. 2) Необходимые для подписывания данные отправляются клиенту. 3) Клиент формирует хэш при помощи ГОСТ 3411 и подписывает его. 4) Готовая подпись отправляется на сервер. 5) Сервер помещает в документ готовую подпись и получается подписанная PDF. Аналогичное решение уже было на JAVA, но код 3-го шага не продемонстрирован, увы. Скорее всего, я как-то не так формирую подпись с помощью CaDES NPAPI на третьем шаге, потому что если сформированный PDF открыть с помощью Acrobat Reader DC (с установленным криптопро PDF), то подпись оказывается недействительна. Ошибка: "Ошибка при подтверждении подписи. Ошибка разбиения по ASN.1: Ошибка при декодировании по правилам BER:". В чём может быть ошибка? Как правильно подписывать PDF при помощи CaDES? Заранее спасибо. Подпись на стороне клиента (шаг 3):
Код: cryptoFunc = function(hash, thumbprint, callback) {
var CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100;
var CADESCOM_BASE64_TO_BINARY = 1;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_MY_STORE = "my";
var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
// Формирование хэша для подписываемых данных по алгоритму GOST3411
// Аналогично MessageDigest md = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME);
var hashedDataPromise = Crypto.createCryptoObjectAsync("CAdESCOM.HashedData");
hashedDataPromise.then(
function(hashObject) {
hashObject.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411;
hashObject.DataEncoding = CADESCOM_BASE64_TO_BINARY;
hashObject.Hash(hash.B64Data);
// Получение сертификата по отпечатку
var oStorePromise = Crypto.createCryptoObjectAsync("CAPICOM.Store");
oStorePromise.then(
function(oStore) {
oStore.Open(CAPICOM_CURRENT_USER_STORE,
CAPICOM_MY_STORE,
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
var certificate = oStore.Certificates
.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint)
.Item(1);
// Подпись хэша
var rawSignaturePromise = Crypto.createCryptoObjectAsync("CAdESCOM.RawSignature");
rawSignaturePromise.then(
function (rawSignature) {
var signatureHex = rawSignature.SignHash(hashObject, certificate);
hash.B64Signature = me.hex2base64(signatureHex);
hash.SignDate = new Date();
hash.B64CertInfo = certificate.GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME);
callback(hash);
});
});
});
}
Формирование PDF на стороне сервера(шаг 1 и 5):
Код: public static byte[] GetPdfAndBytesToSign(Stream unsignedPdf, ref Stream tempPdf, string signatureFieldName)
{
using (PdfReader reader = new PdfReader(unsignedPdf))
{
var stamper = PdfStamper.CreateSignature(reader, tempPdf, reader.PdfVersion);
var appearance = stamper.SignatureAppearance;
appearance.SetVisibleSignature(new Rectangle(36, 100, 164, 150), reader.NumberOfPages, signatureFieldName);
var external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
MakeSignature.SignExternalContainer(appearance, external, 8192);
var bytes = ReadAllBytes(appearance.GetRangeStream());
return bytes;
}
}
public static void EmbedSignature(Stream tempPdf, ref Stream signedPdf, string signatureFieldName, byte[] signedBytes)
{
using (PdfReader reader = new PdfReader(tempPdf))
{
IExternalSignatureContainer external = new MyExternalSignatureContainer(signedBytes); // Контейнер просто возвращает signedBytes при вызове Sign
MakeSignature.SignDeferred(reader, signatureFieldName, signedPdf, external);
}
}
Отредактировано пользователем 25 октября 2016 г. 12:37:19(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил BufferOverflow за этот пост.
|
|