【问题标题】:java.lang.NoSuchMethodError: org.bouncycastle.asn1.x509.GeneralName.getDERObject()java.lang.NoSuchMethodError: org.bouncycastle.asn1.x509.GeneralName.getDERObject()
【发布时间】:2022-01-18 19:54:50
【问题描述】:

我已经将项目从 itext2.1.7.jar 迁移到 itext5.5.13.jar 但是在测试具有签名的 pdf 时出现以下错误:

java.lang.NoSuchMethodError: org.bouncycastle.asn1.x509.GeneralName.getDERObject()

这是我得到错误的方法:

   public URI getCrlUri(X509Certificate certificate) {

              byte[] crlDistributionPointsValue = certificate.getExtensionValue(Extension.cRLDistributionPoints.getId());

              if (null == crlDistributionPointsValue) {

                     return null;

              }

              CRLDistPoint distPoint=null;

              try {

                     distPoint = CRLDistPoint

.getInstance(JcaX509ExtensionUtils.parseExtensionValue(crlDistributionPointsValue));

              } catch (IOException e) {

                                          e.printStackTrace();

              }

              DistributionPoint[] distributionPoints = distPoint.getDistributionPoints();

              for (DistributionPoint distributionPoint : distributionPoints) {

                     DistributionPointName distributionPointName = distributionPoint.getDistributionPoint();

                     if (DistributionPointName.FULL_NAME != distributionPointName.getType()) {

                           continue;

                     }

                     GeneralNames generalNames = (GeneralNames) distributionPointName.getName();

                     GeneralName[] names = generalNames.getNames();

                     for (GeneralName name : names) {

                           if (name.getTagNo() != GeneralName.uniformResourceIdentifier) {

                                  continue;

                           }

                    

                            final DERIA5String derStr = DERIA5String.getInstance(name.getDERObject());

                      

 

                           String str = derStr.getString();

                           URI uri = toURI(str);

                           return uri;

                     }

              }

              return null;

       }

在我的班级路径中,我放置了: 1.bcprov-jdk15on-1.49.jar 2.bcpkix-jdk15on-1.49.jar 3.itextpdf-5.5.13.jar

我根据下载 itextpdf 时得到的 pom.xml 添加的 BouncyCastle 库。

这个项目是建立在以下充气城堡库之上的 1.bcmail-jdk16-143.jar 2.bcprov-jdk16-143.jar 3.bctsp-jdk16-1.44.jar

谁能帮忙解决这个问题。

【问题讨论】:

    标签: java itext x509certificate bouncycastle nosuchmethoderror


    【解决方案1】:

    当您更新代码的依赖项(此处:iText)和传递依赖项(此处:BouncyCastle),并且您也在自己的代码中使用这些传递依赖项时,那么您必须准备好适应您的传递依赖的变化的代码。

    在这种情况下,您使用GeneralName.getDERObject()

    final DERIA5String derStr = DERIA5String.getInstance(name.getDERObject());
    

    该方法存在于较早的 BouncyCastle 版本中,尤其是 1.30 年代。在 1.40 年代,此方法被 getEncoded()getEncoded("DER") 取代。因此,尝试类似:

    final DERIA5String derStr = DERIA5String.getInstance(name.getEncoded("DER"));
    

    但请注意,在那些日子里,BouncyCastle API 非常不稳定,您可能需要使用 BouncyCastle 调整更多代码...


    在你提到的评论中

    现在我得到:java.lang.IllegalArgumentException:getInstance 中的编码错误:java.lang.ClassCastException:org.bouncycastle.asn1.DERTaggedObject 无法转换为 org.bouncycastle.asn1.DERIA5String

    请尝试

    final DERIA5String derStr = DERIA5String.getInstance(name.getName());
    

    改为。

    【讨论】:

    • 非常感谢您的回答@mkl。我已经添加了代码并且 NoSuchMethodError 问题得到了修复,但现在我得到:java.lang.IllegalArgumentException:getInstance 中的编码错误:java.lang.ClassCastException:org.bouncycastle.asn1.DERTaggedObject 无法转换为 org.bouncycastle.asn1 .DERIA5String
    • 我试过 name.getName(), name.toASN1Object(), name.toDERObject() 在所有这些中都得到 NoSuchMethodError()。请帮忙。
    • 非常感谢@mkl。根据我们的回答,我已经更新了项目中的所有代码,现在它可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多