Некоторый рабочий код
Вы использовали PdfSigner
(что имеет смысл только при применении подписи или отметки времени документа, но вы предоставили только уже подписанный файл) и у вас есть некоторые переменные, которых у меня нет здесь , Таким образом, я по существу написал пример, основанный на простых PdfDocument
и ваших общих файлах без этих дополнительных переменных:
using (PdfReader pdfReader = new PdfReader("LTV Doc-Revocation Info Issue.pdf"))
using (PdfWriter pdfWriter = new PdfWriter("LTV Doc-Revocation Info Issue-WithRevocation.pdf"))
using (PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().UseAppendMode()))
{
List<byte[]> ocspCollection = new List<byte[]>();
List<byte[]> crlCollection = new List<byte[]>();
List<byte[]> certsCollection = new List<byte[]>();
ocspCollection.Add(File.ReadAllBytes(@"Ocsp"));
crlCollection.Add(File.ReadAllBytes(@"Crl.crl"));
LtvVerification ltvVerification = new LtvVerification(pdfDocument);
ltvVerification.AddVerification("SH_SIGNATURE_532546", ocspCollection, crlCollection, certsCollection);
ltvVerification.Merge();
}
Проверка результата, который вы видите:
В частности, предоставленный ответ OCSP и предоставленный CRL встроены в PDF, поэтому класс iText LtvVerification
выполняет свою работу.
Возможные проблемы в вашем проекте
Прежде всего, вы говорите:
Я пытаюсь добавить информацию об отзыве (Crls, OCSP Responses, Certificate Chain) к подписи в виде неподписанных атрибутов
Это уже указывает на несоответствие: вы используете класс LtvVerification
, как и я в рабочем коде выше. Этот класс не изменяет встроенные контейнеры CMS. Он не добавляет информацию об отзыве к неподписанным атрибутам встроенного контейнера CMS, но вместо этого в DSS ( Document Security Store) структура PDF.
Внедрение данных отзыва в качестве атрибутов unsigned встроенного контейнера сигнатур CMS на самом деле невозможно совместимым образом: либо вы используете подпись adbe-revocationInfoArchival
атрибута в контейнере CMS или DSS вне контейнера CMS.
(Некоторые валидаторы принимают данные отзыва, внедренные в стиле CAdES в неподписанных атрибутах, но, строго говоря, это запрещено в PAdES, а не совместимость в PDF 2.0.)
Так что, если вы действительно хотите встроить данные отзыва в контейнер CMS, предоставьте им выбранный метод подписи PdfSigner
, все они явно или неявно принимают данные отзыва для встраивания. ,
public virtual void SignDetached(IExternalSignature externalSignature, X509Certificate[] chain,
ICollection<ICrlClient> crlList, IOcspClient ocspClient, ITSAClient tsaClient,
int estimatedSize, PdfSigner.CryptoStandard sigtype)
public virtual void SignDetached(IExternalSignature externalSignature, X509Certificate[] chain,
ICollection<ICrlClient> crlList, IOcspClient ocspClient, ITSAClient tsaClient,
int estimatedSize, PdfSigner.CryptoStandard sigtype, SignaturePolicyInfo signaturePolicy)
public virtual void SignDetached(IExternalSignature externalSignature, X509Certificate[] chain,
ICollection<ICrlClient> crlList, IOcspClient ocspClient, ITSAClient tsaClient,
int estimatedSize, PdfSigner.CryptoStandard sigtype, SignaturePolicyIdentifier signaturePolicy)
или
public virtual void SignExternalContainer(IExternalSignatureContainer externalSignatureContainer,
int estimatedSize)
Бывшие три опыта по закону принимать клиентов CRL и OCSP (которые могут быть реализованы для предоставления уже существующих CRL и OCSP), в то время как последний получает полный контейнер CMS из данной реализации IExternalSignatureContainer
, поэтому в этой реализации вы можете добавить любую информацию, которую захотите.