Получение OcspClient и CrlClient для использования в метке времени LTV - PullRequest
0 голосов
/ 09 октября 2018

Я использую , это , чтобы подписать документ PDF, так как связанный вопрос отражает мой сценарий.Однако я не могу сгенерировать LTV (я использую this в качестве руководства), потому что я не могу создать экземпляр действительных объектов OscpClient и CrlClient для использования в функции addLtv.Я использую iTextSharp 5.5.10.

Есть ли документация, которая может указывать в правильном направлении?

Вот что у меня есть на данный момент:

try {
    // Getting the certificate 
    X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
    X509Certificate2 x509 = selectCert(store.Certificates, "<<some descriptor>>");

    // Initialise the various objects
    PdfReader pdfReader = new PdfReader("<<path to source file>>");
    FileStream signedPdf = new FileStream("<<path to dest file>>", FileMode.Create);

    PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0', null, true);
    pdfStamper.MoreInfo = pdfReader.Info;

    PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
    X509Certificate2Signature externalSignature = new X509Certificate2Signature(x509, "SHA-256");

    Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
    Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] {
        cp.ReadCertificate(x509.RawData)
    };

    // Initialise the IOcspClient implementor
    // https://itextsupport.com/apidocs/itext5/latest/com/itextpdf/text/pdf/security/OcspClientBouncyCastle.html
    OcspClientBouncyCastle ocsp = new OcspClientBouncyCastle(
        // The first point that I get stuck on the documentation
        new OCSPVerifier()
    );

    // Initialise the ICrlClient implementor
    // https://itextsupport.com/apidocs/itext5/latest/com/itextpdf/text/pdf/security/CrlClientOnline.html
    CrlClientOnline crl = new CrlClientOnline(
        // https://stackoverflow.com/a/40894818
        GetCrlDistributionPointURI(x509)
    );

    List<String> names = pdfStamper.AcroFields.GetSignatureNames();
    String sigName = names[names.Capacity - 1];
    PdfPKCS7 pkcs7 = pdfStamper.AcroFields.VerifySignature(sigName);

    // The long term validation
    if (pkcs7.IsTsp) {
        pdfStamper.LtvVerification.AddVerification(
            sigName, ocsp, crl,
            LtvVerification.CertificateOption.SIGNING_CERTIFICATE,
            LtvVerification.Level.OCSP_CRL,
            LtvVerification.CertificateInclusion.NO
        );
    }
    else {
        foreach (String name in names) {
            pdfStamper.LtvVerification.AddVerification(
                name, ocsp, crl,
                LtvVerification.CertificateOption.WHOLE_CHAIN,
                LtvVerification.Level.OCSP_CRL,
                LtvVerification.CertificateInclusion.NO
            );
        }
    }

    // Sign the doc and 
    MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
    pdfStamper.Close();
    return "Done";
}

catch (Exception ex) {
    return ex.Message;
}

1 Ответ

0 голосов
/ 23 октября 2018

Клиент OCSP

// Initialise the IOcspClient implementor
// https://itextsupport.com/apidocs/itext5/latest/com/itextpdf/text/pdf/security/OcspClientBouncyCastle.html
OcspClientBouncyCastle ocsp = new OcspClientBouncyCastle(
    // The first point that I get stuck on the documentation
    new OCSPVerifier()
);

Прежде всего, вам нужен только экземпляр OcspVerifier, если вы хотите проверить ответы OCSP.Поскольку ваша задача - создать подпись с информацией о LTV, вы можете пропустить эту проверку, если уверены, что вашей программе не придется иметь дело с нарушенной инфраструктурой CA PKI.Т.е. вы можете сделать

OcspClientBouncyCastle ocsp = new OcspClientBouncyCastle(null);

(или даже

OcspClientBouncyCastle ocsp = new OcspClientBouncyCastle();

, если устаревший тег вас не беспокоит).

В противном случае, если вы действительно хотите проверитьОтветы OCSP, конструктор OCSPVerifier имеет два параметра:

/**
 * Creates an OCSPVerifier instance.
 * @param verifier  the next verifier in the chain
 * @param ocsps a list of OCSP responses
 */
public OcspVerifier(CertificateVerifier verifier, List<BasicOcspResp> ocsps)

Поскольку у вас нет ни идеи о том, как основывать проверку ответов OCSP на некоторых CertificateVerifier, ни список готовых ответов OCSP, не так ли?пытался еще просто использовать

OcspClientBouncyCastle ocsp = new OcspClientBouncyCastle(
    new OCSPVerifier(null, null)
);

клиент CRL

// Initialise the ICrlClient implementor
// https://itextsupport.com/apidocs/itext5/latest/com/itextpdf/text/pdf/security/CrlClientOnline.html
CrlClientOnline crl = new CrlClientOnline(
    // https://stackoverflow.com/a/40894818
    GetCrlDistributionPointURI(x509)
);

Если ваш код не работает (что я не могу проверить, потому что вы не объясняете этот метод GetCrlDistributionPointURI):попробовал использовать конструктор по умолчанию:

CrlClientOnline crl = new CrlClientOnline();

В зависимости от вашей PKI это может быть все, что вам нужно ...

LTV, включающий

Это не ясно из вашего вопросакакую информацию о LTV вы хотите добавить в свой PDF.Поскольку вы не упоминаете ПАДЫ , я предполагаю, что вы хотите добавить информацию для проприетарной проверки Adobe «LTV enabled».

В этом случае вы можете просто попробовать AdobeLtvEnablingкласс из этого ответа на вопрос "Я хочу подписать документ PDF с помощью ITextSharp и вернуть файл с поддержкой ltv pdf" .

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