Чтобы проверить PDF в автономном режиме, я настраиваю SignatureValidator для отключения онлайн-извлечения данных OCSP/CRL. Однако проверка завершается неудачно, если не включена онлайн-загрузка. Отладка кода iText показывает, что данные OCSP/CRL, встроенные в DSS, не используются SignatureValidator.
Шаги по воспроизведению (с использованием iText 9.0)
Код: Выделить всё
// 1) Sign the pdf
var inputPdfReader = new PdfReader("not_signed.pdf");
var outputStream = new FileStream("signed.pdf", FileMode.Create);
var tsaClient = new TSAClientBouncyCastle("https://freetsa.org/tsr", null, null, 8192, "SHA-256");
var stampingProperties = new StampingProperties();
PdfSigner pdfSigner = new PdfSigner(inputPdfReader, outputStream, stampingProperties);
pdfSigner.Timestamp(tsaClient, null);
outputStream.Close();
// 2) Add LTV information:
var signedReader = new PdfReader("signed.pdf");
var ltvWriter = new PdfWriter("signed_ltv.pdf");
var ltvDocument = new PdfDocument(signedReader, ltvWriter, new StampingProperties().UseAppendMode());
LtvVerification v = new LtvVerification(ltvDocument);
SignatureUtil signatureUtil = new SignatureUtil(ltvDocument);
var names = signatureUtil.GetSignatureNames();
var pkcs7 = signatureUtil.ReadSignatureData(names.Single());
Debug.Assert(pkcs7.IsTsp());
v.AddVerification(names[0], (IOcspClient)new OcspClientBouncyCastle(), new CrlClientOnline(), LtvVerification.CertificateOption.WHOLE_CHAIN,
LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.NO);
v.Merge();
ltvDocument.Close();
// 3) Verify the LTV information:
var validationProperties = new SignatureValidationProperties();
// It works if I comment the next line and allow online fetching. But I think it should work without...
validationProperties.SetRevocationOnlineFetching(ValidatorContexts.All(), CertificateSources.All(), TimeBasedContexts.All(), SignatureValidationProperties.OnlineFetching.NEVER_FETCH);
// bugfix for iText 9.0 https://kb.itextpdf.com/itext/workaround-for-required-extension-missing-or-incor
List certIssuerRequiredExtensions = new();
certIssuerRequiredExtensions.Add(new KeyUsageExtension(KeyUsage.KEY_CERT_SIGN));
certIssuerRequiredExtensions.Add(new DynamicBasicConstraintsExtension());
validationProperties.SetRequiredExtensions(CertificateSources.Of(CertificateSource.CERT_ISSUER),
[new KeyUsageExtension(KeyUsage.KEY_CERT_SIGN), new MyDynamicBasicConstraintsExtension()]);
var ks = new List();
using (var stream = new FileStream("freetsa_root.cer", FileMode.Open))
{
ks.Add(new X509CertificateBC(new X509CertificateParser().ReadCertificate(stream)));
}
using (var stream = new FileStream("freetsa_root2.cer", FileMode.Open))
{
ks.Add(new X509CertificateBC(new X509CertificateParser().ReadCertificate(stream)));
}
var validatorChainBuilder = new ValidatorChainBuilder()
.WithSignatureValidationProperties(validationProperties)
.WithTrustedCertificates(ks);
ltvDocument = new PdfDocument(new PdfReader("signed_ltv.pdf"));
var validator = validatorChainBuilder.BuildSignatureValidator(ltvDocument);
var validationReport = validator.ValidateSignatures();
var validationFailures = validationReport.GetFailures();
Проверка не удалась, поскольку автономная выборка отключена. Судя по моей отладке, выяснилось, что данные OCSP/CRL, встроенные в DSS, игнорируются SignatureValidator.
Рабочий процесс работает, если я разрешаю онлайн-загрузку (прокомментируйте строку указано в кодексе). Однако я хочу, чтобы рабочий процесс полностью полагался на встроенные данные DSS для автономной проверки.
Чтобы воспроизвести это, вам понадобятся корневые сертификаты freetsa.org (один для подписи, второй другой для OCSP). Я извлек их с помощью функции «Экспорт сертификата» Adobe Readers.
Буду очень признателен за любую информацию или обходные пути.
Подробнее здесь: https://stackoverflow.com/questions/793 ... fetching-i