У меня есть 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. Любое решение или предложение приветствуются. Спасибо

0
Elmoro 26 Мар 2019 в 20:02

1 ответ

Лучший ответ

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

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

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

1
mkl 28 Мар 2019 в 14:52