Добавить информацию об отзыве в подпись с помощью iText7 - PullRequest
0 голосов
/ 20 февраля 2020

Я делаю Долгосрочную подпись. Я пытаюсь добавить информацию об аннулировании (Crls, OCSP Responses, Certificate Chain) к подписи как неподписанные атрибуты, но информация об аннулировании не включена в окончательную подпись. Ниже приведен фрагмент кода:

        Stream outputStream = new MemoryStream();

        List<byte[]> ocspCollection = new List<byte[]>();
        List<byte[]> crlCollection = new List<byte[]>();
        List<byte[]> certsCollection = new List<byte[]>();

        Stream readerStream = new MemoryStream(signedDocument);
        PdfReader pdfReader = new PdfReader(readerStream);
        PdfSigner pdfSigner = new PdfSigner(pdfReader, outputStream, new StampingProperties().UseAppendMode());

        LtvVerification ltvVerification = new LtvVerification(pdfSigner.GetDocument());

        X509Chain chain = new X509Chain();
        chain.Build(signerCertificate);

        foreach (X509ChainElement item in chain.ChainElements)
        {
            byte[] certBytes = item.Certificate.Export(X509ContentType.Cert);
            certsCollection.Add(certBytes);
        }

        foreach (byte[] ocsp in revocationInfo.OCSPResponses)
        {
            ocspCollection.Add(ocsp);
        }

        foreach (byte[] crlBytes in revocationInfo.CRLs)
        {
            crlCollection.Add(crlBytes);
        }

        bool revocationInfoAdded = ltvVerification.AddVerification(signingRequest.FieldName, ocspCollection, crlCollection, certsCollection);

ltvVerification.AddVerification () метод возвращает true в ответ.

Найдите подписанный документ по ссылке ниже: https://1drv.ms/b/s! AvIgyv7xAxxoihGn9aFbe9TQSps4? e = eKPdn8

Любая помощь в этом отношении высоко ценится. Привет

1 Ответ

1 голос
/ 20 февраля 2020

Некоторый рабочий код

Вы использовали 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();
}

Проверка результата, который вы видите:

Screen shot of PDF structure

В частности, предоставленный ответ 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, поэтому в этой реализации вы можете добавить любую информацию, которую захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...