创建 BouncyCastle OCSP 响应

本文关键字:响应 OCSP BouncyCastle 创建 | 更新日期: 2023-09-27 18:35:36

我正在努力在BouncyCastle中查找有关OCSP的信息,我在网上找到的示例充其量是模糊的,所以我想我会尝试在这里问一下。

这是我的问题:我正在尝试在 BouncyCastle for .NET 中执行 OCSP,但我在 OCSP 响应方面遇到问题,特别是,一旦我序列化了响应并将其发送给收件人,我不明白如何恢复响应。

问题很可能是我以一种错误的方式构建响应本身,因为我这样做的方式是由网上找到的零碎和我纯粹的"直觉"拼凑而成的。以下是我创建响应的方式:

        X509CrlEntry crlentry = Repository.CRL.GetRevokedCertificate(certToCheck.SerialNumber);
        BasicOcspRespGenerator basicRespGen = new BasicOcspRespGenerator(Repository.Data.BouncyCastlePublicKey);
        if (crlentry == null) {
            //still valid
            basicRespGen.AddResponse(certToCheck, CertificateStatus.Good);
        } else {
            //revoked
            DerGeneralizedTime dt = new DerGeneralizedTime(crlentry.RevocationDate);
            RevokedInfo rinfo = new RevokedInfo(dt, new CrlReason(CrlReason.CessationOfOperation));
            RevokedStatus rstatus = new RevokedStatus(rinfo);
            basicRespGen.AddResponse(certToCheck, rstatus);
        }
        BasicOcspResp response = basicRespGen.Generate("SHA512withRSA", Repository.Data.BouncyCastlePrivateKey, new X509Certificate[] { Repository.Data.MyCertificate }, DateTime.Now);
        byte[] responseBytes = response.GetEncoded;
    //I then send the bytes back to the client who made the request

问题是现在我不知道如何从其序列化的字节[]形式中获取响应...似乎没有工厂/解析器或构造函数来恢复它。有一个 OcspResp 构造函数接受 byte[] 作为参数,但它抛出了一个异常,我认为是因为 OcspResp 和 BasicOcspResp 是不同的东西。

有人可以帮助我吗?我构建响应本身是错误的,还是只是我不知道如何反序列化它?有什么提示吗?

提前致谢Master_T

创建 BouncyCastle OCSP 响应

这太老了,但如果有人寻找答案,这里是:在提取字节之前,必须将 BasicOcspResp 包装到 OcspResp 中。

在服务器上创建响应:

    X509CrlEntry crlentry = Repository.CRL.GetRevokedCertificate(certToCheck.SerialNumber);
    BasicOcspRespGenerator basicRespGen = new BasicOcspRespGenerator(Repository.Data.BouncyCastlePublicKey);
    if (crlentry == null) {
        //still valid
        basicRespGen.AddResponse(certToCheck, CertificateStatus.Good);
    } else {
        //revoked
        DerGeneralizedTime dt = new DerGeneralizedTime(crlentry.RevocationDate);
        RevokedInfo rinfo = new RevokedInfo(dt, new CrlReason(CrlReason.CessationOfOperation));
        RevokedStatus rstatus = new RevokedStatus(rinfo);
        basicRespGen.AddResponse(certToCheck, rstatus);
    }
    BasicOcspResp basicOcspResp = basicRespGen.Generate("SHA512withRSA", Repository.Data.BouncyCastlePrivateKey, new X509Certificate[] { Repository.Data.MyCertificate }, DateTime.Now);
    var ocspResponseGenerator = new OCSPRespGenerator();
    var ocspResponse = ocspResponseGenerator.Generate(OCSPRespGenerator.Successful, basicOcspResp);
    byte[] responseBytes = ocspResponse.GetEncoded();

在客户端上读取响应:

    OcspResp ocspResponse = new OcspResp(responseBytes);
    BasicOcspResp basicOcspResponse = (BasicOcspResp)ocspResponse.GetResponseObject();