Почему при применении TSA возникает исключение «Недостаточно места»? - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь применить TSA, используя приведенный ниже код. Почему у меня: исключение «Недостаточно места»

Подготовить контейнер подписи:

        ITSAClient tsaClient = new TSAClientBouncyCastle("https://freetsa.org/tsr", "", "");

        PdfSigner signer = new PdfSigner(new PdfReader("results/example.pdf"), new FileStream("results/prepared1.pdf", FileMode.Create), new StampingProperties().UseAppendMode());
        signer.SetFieldName("Signature1");
        signer.SetCertificationLevel(0);
        signer.Timestamp(tsaClient, "Signature1");   // EXCEPTION THROWN HERE

        PdfSignatureAppearance sigAppearance = signer.GetSignatureAppearance();
        sigAppearance
            .SetPageRect(new Rectangle(144, 144, 200, 100))
            .SetPageNumber(1)
            .SetContact("This is contact1")
            .SetReason("This is reason1")
            .SetLocation("This is location1")
            .SetSignatureCreator("This is signature creator");

        ExternalEmptySignatureContainer container = new ExternalEmptySignatureContainer();
        signer.SignExternalContainer(container, 8192);

        byte[] dataToSign = container.Data;

        return dataToSign;enter code here

Not enough space

1 Ответ

1 голос
/ 25 мая 2020

Вы используете конструктор TSAClientBouncyCastle без оценки размера:

ITSAClient tsaClient = new TSAClientBouncyCastle("https://freetsa.org/tsr", "", "");

Таким образом, предполагается значение по умолчанию 4 КБ. Таким образом, когда вы применяете отметку времени документа

signer.Timestamp(tsaClient, "Signature1");

, зарезервировано место для маркера отметки времени размером 4 КБ, затем запрашивается отметка времени. Сообщение об ошибке, которое вы здесь получаете, теперь сообщает вам, что фактически полученная метка времени, по-видимому, больше.

Поэтому вам следует использовать конструктор TSAClientBouncyCastle, который также принимает параметр размера и устанавливает его, например, на 8 КБ = 8192.


При этом вы, кажется, неправильно понимаете метод Timestamp: он немедленно применяет метку времени документа, а затем закрывает документ:

    /// <summary>Signs a document with a PAdES-LTV Timestamp.</summary>
    /// <remarks>
    /// Signs a document with a PAdES-LTV Timestamp. The document is closed at the end.
    /// <br /><br />
    /// NOTE: This method closes the underlying pdf document. This means, that current instance
    /// of PdfSigner cannot be used after this method call.
    /// </remarks>
    /// <param name="tsa">the timestamp generator</param>
    /// <param name="signatureName">
    /// the signature name or null to have a name generated
    /// automatically
    /// </param>
    public virtual void Timestamp(ITSAClient tsa, String signatureName)

Таким образом, вы столкнется с другими ошибками после исправления проблемы с оценкой размера токена отметки времени!

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