You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iText 8.0.4中IBasicOCSPResponse转换为IBasicOCSPResp时抛出ClassCastException的解决方案咨询

iText 8.0.4中IBasicOCSPResponse转换为IBasicOCSPResp时抛出ClassCastException的解决方案咨询

我正在使用iText 8.0.4(GitHub仓库),尝试将com.itextpdf.signatures包下的IBasicOCSPResponse转换为com.itextpdf.commons.bouncycastle.cert.ocsp包下的IBasicOCSPResp,因为我需要这样来使用OCSPVerifier:

List<IBasicOCSPResp> ocsps = new ArrayList<>();
if (pkcs7.getOcsp() != null) {
    ocsps.add((IBasicOCSPResp) pkcs7.getOcsp()); // 抛出ClassCastException
}

// 检查列表中的OCSP响应在指定日期对证书是否有效
OCSPVerifier ocspVerifier = new OCSPVerifier(null, ocsps);

但这样做会触发如下ClassCastException:

java.lang.ClassCastException: class
com.itextpdf.bouncycastle.asn1.ocsp.BasicOCSPResponseBC cannot be
cast to class
com.itextpdf.commons.bouncycastle.cert.ocsp.IBasicOCSPResp
(com.itextpdf.bouncycastle.asn1.ocsp.BasicOCSPResponseBC and
com.itextpdf.commons.bouncycastle.cert.ocsp.IBasicOCSPResp are in
unnamed module of loader 'app')

以下是涉及到的完整函数:

public VerifResult checkRevocation(PdfPKCS7 pkcs7, X509Certificate signCert, 
                                   X509Certificate issuerCert, Date date, Signature signature)
        throws GeneralSecurityException {

    List<IBasicOCSPResp> ocsps = new ArrayList<>();
    if (pkcs7.getOcsp() != null) {
        ocsps.add((IBasicOCSPResp) pkcs7.getOcsp()); // 抛出ClassCastException
    }

    // 检查OCSP响应的有效性
    OCSPVerifier ocspVerifier = new OCSPVerifier(null, ocsps);
    List<VerificationOK> verification = ocspVerifier.verify(signCert, issuerCert, date);

    // 如果OCSP验证失败,回退到CRL验证
    if (verification.isEmpty()) {
        List<X509CRL> crls = new ArrayList<>();
        if (pkcs7.getCRLs() != null) {
            for (CRL crl : pkcs7.getCRLs()) {
                crls.add((X509CRL) crl);
            }
        }
        CRLVerifier crlVerifier = new CRLVerifier(null, crls);
        verification.addAll(crlVerifier.verify(signCert, issuerCert, date));
    }

    boolean ok = false;
    if (verification.isEmpty()) {
        logger.info("[{}] 签名证书无法被验证", this.traceid);
        signature.setNotRevokedWhenSigned(false);
        return new VerifResult(false, false);
    } else {
        for (VerificationOK v : verification) {
            logger.info(v);
            signature.setNotRevokedWhenSigned(true);
            ok = true;
        }
    }
    signature.setNotRevokedWhenSigned(false);
    return new VerifResult(false, ok);
}

我使用的依赖如下:

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>bouncy-castle-adapter</artifactId>
        <version>${itext.version}</version>
    </dependency>

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-core</artifactId>
        <version>${itext.version}</version>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>kernel</artifactId>
        <version>${itext.version}</version>
    </dependency>
</dependencies>

我已经尝试过以下方法,但都没有解决问题:

  • 检查是否存在重复的依赖版本
  • 使用依赖管理(反而引发了更多错误)
  • 将pkcs7.getOcsp().toASN1Primitive().getEncoded()转换为IBasicOCSPResp(结果提示格式错误:malformed response: illegal object in getInstance: org.bouncycastle.asn1.DLSequence)

我现在有两个疑问:

  1. 如何正确地将com.itextpdf.signatures下的IBasicOCSPResponse转换为com.itextpdf.commons.bouncycastle.cert.ocsp下的IBasicOCSPResp,以便在OCSPVerifier中使用?
  2. 有没有什么变通方法可以避免这个类型转换异常的问题?

希望能得到大家的指导,提前感谢!

备注:内容来源于stack exchange,提问作者blinkbink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:45:29