Подписание PDF с ITEXT: подпись недействительна после подписанияC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Подписание PDF с ITEXT: подпись недействительна после подписания

Сообщение Anonymous »

Я использую ITEXT, чтобы подписать документ PDF с внешней подписью, но подпись отмечена как измененная или поврежденная. При открытии в Adobe Acrobat я получаю следующее сообщение: < /p>
The document has been altered or corrupted since the signature was applied.
Signed by the current user
Signing time is based on the local computer clock
Signature details: Last verification: 2025.03.31 15:14:37 +03'00'
Field: Signature_1 (invisible signature)
< /code>
Вот мой код подписи: < /p>
public AttachDocumentSignResponseDto AttachDocumentSign(byte[] documentBytes, byte[] signatureBytes)
{
ArgumentNullException.ThrowIfNull(documentBytes);
ArgumentNullException.ThrowIfNull(signatureBytes);

using var readerStream = new MemoryStream(documentBytes);
using var outputStream = new MemoryStream();
using var pdfReader = new PdfReader(readerStream);

IExternalSignatureContainer external = new MfuaExternalSignatureContainer(signatureBytes);

var fieldName = PdfConstants.SignatureName(documentBytes.SignaturesCount());

PdfSigner.SignDeferred(
pdfReader,
fieldName,
outputStream,
external);

var signedPdfBytes = outputStream.ToArray();

return new AttachDocumentSignResponseDto(Convert.ToBase64String(signedPdfBytes));
}

public sealed class MfuaExternalSignatureContainer : IExternalSignatureContainer
{
private readonly byte[] _signatureBytes;

public MfuaExternalSignatureContainer(byte[] signatureBytes)
{
ArgumentNullException.ThrowIfNull(signatureBytes);

_signatureBytes = signatureBytes;
}

public byte[] Sign(Stream data)
{
return _signatureBytes;
}

public void ModifySigningDictionary(PdfDictionary signDic)
{
signDic.Put(PdfName.Filter, PdfName.Adobe_PPKLite);
signDic.Put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
}
}
< /code>
Что может привести к модификации PDF после подписания?public AttachDocumentSignResponseDto AttachDocumentSign(byte[] documentBytes, byte[] signatureBytes)
{
ArgumentNullException.ThrowIfNull(documentBytes);
ArgumentNullException.ThrowIfNull(signatureBytes);
ArgumentNullException.ThrowIfNull(documentBytes);

using var outputStream = new MemoryStream();
using var readerStream = new MemoryStream(documentBytes);
using var reader = new PdfReader(readerStream);

var fieldName = PdfConstants.SignatureName(documentBytes.SignaturesCount());

PdfTwoPhaseSigner.AddSignatureToPreparedDocument(reader, fieldName, outputStream, signatureBytes);

return new AttachDocumentSignResponseDto(Convert.ToBase64String(outputStream.ToArray()));
}
< /code>
Подготовьте метод документа: < /p>
public PrepareDocumentSignResponseDto PrepareDocumentSign(byte[] documentBytes, AlgorithmSignature algorithmSignature, byte[] certificateBytes)
{
ArgumentNullException.ThrowIfNull(documentBytes);
ArgumentNullException.ThrowIfNull(algorithmSignature);
ArgumentNullException.ThrowIfNull(certificateBytes);

using var readerStream = new MemoryStream(documentBytes);
using var outputStream = new MemoryStream();

using var reader = new PdfReader(readerStream);
using var writer = new PdfWriter(outputStream);
using (var pdfDoc = new PdfDocument(reader, writer))
{
var signatureRect = pdfDoc.AddRectangleSignature();
var signaturePage = pdfDoc.GetLastPage();

signaturePage.AddTitle(signatureRect);
signaturePage.AddCertificateInfo(signatureRect, certificateBytes);
}

var pdfBytes = outputStream.ToArray();

using var finalOutput = new MemoryStream();

var hash = PdfSignatureHelper.AddEmptySignature(pdfBytes, finalOutput, algorithmSignature);

var finalPdfBytes = finalOutput.ToArray();

return new PrepareDocumentSignResponseDto(Convert.ToBase64String(finalPdfBytes), hash);
}

public static string AddEmptySignature(byte[] documentBytes, Stream outputStream, AlgorithmSignature algorithmSignature)
{
ArgumentNullException.ThrowIfNull(documentBytes);

using var readerStream = new MemoryStream(documentBytes);
using var reader = new PdfReader(readerStream);

var signerProperties = new SignerProperties();

var fieldName = PdfConstants.SignatureName(documentBytes.SignaturesCount() + 1);
signerProperties.SetFieldName(fieldName);

var twoPhaseSigner = new PdfTwoPhaseSigner(reader, outputStream);
twoPhaseSigner.SetExternalDigest(new CryptoProDigest());

var hashBytes = twoPhaseSigner.PrepareDocumentForSignature(
signerProperties,
algorithmSignature.ToString(),
PdfName.Adobe_PPKLite,
PdfName.Adbe_pkcs7_detached,
PdfConstants.MaxSignatureSize,
true);

var hash = string.Join(":", hashBytes.Select(x => x.ToString("X2")));

return hash;
}

public class CryptoProMessageDigest : IMessageDigest
{
private readonly HashAlgorithm _hashAlgorithm;

public CryptoProMessageDigest(string hashAlgorithm)
{
_hashAlgorithm = hashAlgorithm switch
{
nameof(AlgorithmSignature.Gost_R3411_2012_256) => new Gost3411_2012_256CryptoServiceProvider(),
nameof(AlgorithmSignature.Gost_R3411_2012_512) => new Gost3411_2012_512CryptoServiceProvider(),
_ => throw new NotSupportedException(hashAlgorithm)
};
}

public byte[] Digest(byte[] enc)
{
return _hashAlgorithm.ComputeHash(enc);
}

public byte[] Digest()
{
_hashAlgorithm.TransformFinalBlock([], 0, 0);

return _hashAlgorithm.Hash ?? throw new InvalidOperationException();
}

public int GetDigestLength()
{
return _hashAlgorithm.HashSize / 8; // 256 / 8 = 32 байта, 512 / 8 = 64 байта
}

public void Update(byte[] buf, int off, int len)
{
_hashAlgorithm.TransformBlock(buf, off, len, null, 0);
}

public void Update(byte[] buf)
{
_hashAlgorithm.TransformBlock(buf, 0, buf.Length, null, 0);
}

public void Reset()
{
_hashAlgorithm.Initialize();
}

public string GetAlgorithmName()
{
return _hashAlgorithm.GetType().Name;
}
}
< /code>
Вот моя команда создания сертификатов, которую я использую для подписания < /p>
New-SelfSignedCertificate -Type Custom -Subject "CN=Caphyon, O=Caphyon, C=US" -KeyUsage DigitalSignature -FriendlyName "My Friendly Cert Name" -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")


Подробнее здесь: https://stackoverflow.com/questions/795 ... er-signing
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Подписание PDF с ITEXT: подпись недействительна после подписания
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Подписание PDF с ITEXT: подпись недействительна после подписания
    Anonymous » » в форуме C#
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Ошибка времени выполнения с использованием выражения подписания подписания
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Ошибка времени выполнения с использованием выражения подписания подписания, скомпилированной компилятором MS VS22 C ++
    Anonymous » » в форуме C++
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Подпись PDF itext pkcs7 с несколькими знаками
    Гость » » в форуме JAVA
    0 Ответы
    76 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»