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)
我现在有两个疑问:
- 如何正确地将
com.itextpdf.signatures下的IBasicOCSPResponse转换为com.itextpdf.commons.bouncycastle.cert.ocsp下的IBasicOCSPResp,以便在OCSPVerifier中使用? - 有没有什么变通方法可以避免这个类型转换异常的问题?
希望能得到大家的指导,提前感谢!
备注:内容来源于stack exchange,提问作者blinkbink
相关产品推荐
相关产品推荐

