Как проверить, что PDF-файл содержит действительную цифровую подпись? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть PDF-файл с цифровой подписью, и я хотел бы проверить, если:

1) PDF-файл содержит подпись

2) если подпись действительна

Я уже пробовал некоторый код с использованием библиотеки iTextSharp, но безуспешно.Поместите одно из решений, которые я пробовал, но безуспешно.Особенно, когда я проверяю names.Count, он успешен и сразу возвращает false.Я прилагаю экран для чтения AcroFields, я не знаю, может ли это помочь понять проблему.Я не могу выбраться из этого.

enter image description here enter image description here

public static bool ValidateFileSignatures(byte[] file)
{

    PdfReader reader = new PdfReader(file);

    AcroFields af = reader.AcroFields;
    var names = af.GetSignatureNames();
    if (names.Count == 0)
        return false; // no signatures

    foreach (string name in names)
    {
        if (!af.SignatureCoversWholeDocument(name))
        {
            return false;
        }

        PdfPKCS7 pk = af.VerifySignature(name);


        if (!pk.Verify())
        {
            return false;
        }
    }

    return true;
}

Образец PDF можно найти здесь

Я также нашел другое решение, использующее библиотеку Pknet, но не смог найти пакет NuGet.Любое решение или предложение приветствуется.Спасибо

1 Ответ

1 голос
/ 27 марта 2019

В заголовке вашего вопроса вы спрашиваете способ , чтобы убедиться, что pdf-файл содержит действительную цифровую подпись .

Файл примера, который вы предоставили, однако, не a pdf-файл, содержащий цифровую подпись ; наоборот, это контейнер для подписи , содержащий PDF в качестве встроенных подписанных данных !

Таким образом, неудивительно, что iText сообщает вам (посредством af.GetSignatureNames().Count == 0), что PDF не содержит никаких подписей, потому что это действительно не так.

Чтобы проверить, есть ли у вас подписанный PDF, например, вам не нужна библиотека PDF, такая как iText, но есть библиотека / API другого типа, библиотека, которая может проверять содержимое и проверять подписи контейнера подписи CMS. например BouncyCastle для первой простой проверки или eSignature DSS для проверки подписи, соответствующей требованиям ЕС.


Для фонов на PDF-файлах со встроенными подписями см. этот ответ .


Учитывая вашу подпись в качестве примера, вас может заинтересовать валидация в соответствии с европейским квалифицированным законодательством о подписи.

Одной общедоступной реализацией валидатора для этого является CEF Digital Signature Services . Для проверки с помощью этого программного обеспечения существует демонстрационное веб-приложение .

DSS написан на Java, но вы можете запустить его как службу, с которой вы общаетесь через REST. Это также должно обеспечить простую интеграцию с кодом .Net.

Если это вариант для вас, просто используйте демонстрационное веб-приложение для проверки ваших тестовых случаев и проверки соответствия результатов вашим ожиданиям. Например. Ваш файл примера подтвержден как TOTAL_PASSED. (На мой взгляд, очень важно, чтобы ответ OCSP для сертификата подписавшего был подписан с использованием SHA1withRSA / 2048.)

Если это не вариант, вы все равно можете проверить проект на github , чтобы получить представление о полномасштабной подписи и проверке подписи.

Если требуемый профиль проверки отличается, уточните.

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