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