OscpVerifier проверяет сертификат подписывающих OCSP по текущей дате вместо signDate - ошибка или функция? - PullRequest
0 голосов
/ 14 января 2019

Я использую iTextSharp 5.5.13 для подписи и проверки файлов PDF. Несколько дней назад у меня появилось исключение в OcspVerifier. Проверка , в которой указано, что срок действия сертификата истек в 20181225 ... GMT + 00: 00 "

Все файлы PDF подписаны вложенным ответом OCSP и CLR. Проверка была выполнена с использованием даты подписания, и она работала нормально до тех пор, пока не истек срок действия сертификата подписавшего ocsp .

Несмотря на то, что все сертификаты были действительны на момент подписания, OcspVerifier.Verify начал выдавать исключение, в котором говорится «истек срок действия сертификата ...».

if (pkcs7.Ocsp != null)
     ocsps.Add(pkcs7.Ocsp);
PdfOcspVerifier ocspVerifier = new PdfOcspVerifier(null, ocsps);
ocspVerifier.OnlineCheckingAllowed = false;
List<VerificationOK> verification = ocspVerifier.Verify(signCert, issuerCert, signDate.ToUniversalTime());

EXCEPTION: "certificate expired on 20181225...GMT+00:00"

Это похоже на ошибку для меня? Есть ли причина, по которой сертификат подписавшего OCSP не проверяется на дату подписания?

Класс OscpVerifier - оригинал, со строкой, которая проверяет сертификат на текущую дату:

 virtual public void IsValidResponse(BasicOcspResp ocspResp, X509Certificate issuerCert)
{
....
    //check if lifetime of certificate is ok
    responderCert.CheckValidity();
}

Модифицированная версия OscpVerifier.cs:

// old definition with old functionality
virtual public void IsValidResponse(BasicOcspResp ocspResp, X509Certificate issuerCert)
{
            IsValidResponse(ocspResp, issuerCert, DateTime.UtcNow);
}

// with signDate parameter:
virtual public void IsValidResponse(BasicOcspResp ocspResp, X509Certificate issuerCert, DateTime signDate)
{
...

    //check if lifetime of certificate is ok
    responderCert.CheckValidity(signDate);
    //responderCert.CheckValidity();
}

с соответствующим изменением вызова метода:

virtual public bool Verify(BasicOcspResp ocspResp, X509Certificate signCert, X509Certificate issuerCert, DateTime signDate)
{
...
...     {
            // check if the OCSP response was genuine
            IsValidResponse(ocspResp, issuerCert);
            return true;
        }
...
}

до:

virtual public bool Verify(BasicOcspResp ocspResp, X509Certificate signCert, X509Certificate issuerCert, DateTime signDate)
{
...
...     {
            // check if the OCSP response was genuine
            IsValidResponse(ocspResp, issuerCert, signDate);
            return true;
        }
...
}

Я включил этот вариант класса OscpVerifier непосредственно в проект, и теперь он проверяет старые подписи, как и ожидалось.

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

1 Ответ

0 голосов
/ 14 января 2019

Сертификат подписчика OCSP должен быть проверен в текущее время, за исключением случаев, когда ответ OCSP был защищен отметкой времени, поэтому itext работает правильно.


Подводя итог, ответ OCSP содержит (См. RFC6960 ):

  • целевой сертификат и срок действия интерфала

  • время, когда был сгенерирован ответ

  • Цифровая подпись доверенного ЦС и его сертификат

Критерии для принятия ответа OCSP установлены в RFC, но он не проясняет ваш вопрос, поскольку не устанавливает, как проверять ответ с течением времени.

3,2. Требования к подписанному ответу

До принятия подписанного ответа для определенного сертификата как действительные, клиенты OCSP ДОЛЖНЫ подтвердить, что:

  1. Сертификат, указанный в полученном ответе, соответствует сертификату, указанному в соответствующем запросе;

  2. Подпись на ответе действительна;

  3. Идентификатор подписавшего лица соответствует предполагаемому получателю запроса;

  4. В настоящее время подписавшая сторона уполномочена предоставить ответ на соответствующий сертификат;

  5. Время, в которое указанный статус, как известно, является правильным (thisUpdate), является относительно недавним;

  6. Когда доступно, время, в которое или до которого будет доступна более новая информация о состоянии сертификата (nextUpdate), больше текущего времени.

Однако это указывает на то, что цифровая подпись должна быть действительной (2). В целом, чтобы подпись считалась действительной, она должна соответствовать:

  • Криптографическая целостность

  • Срок действия сертификата (срок действия и отзыв)

Ответ OCSP с просроченным сертификатом не будет соответствовать второму критерию и поэтому должен быть отклонен. Чтобы продлить период, в течение которого действительна подпись, в контент необходимо добавить метку времени. Стандарт PAdES определяет, как

Существует также руководство ETSI с подробной информацией о том, как выполнить проверку подписей PAdES и CAdES, но, к сожалению, я не нашел ссылку сейчас

...