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

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

我已经将项目从 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;

       }

在我的 class 路径中,我放置了: 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

任何人都可以帮助解决这个问题。

当您更新代码的依赖项(此处: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 调整更多代码...


在您提到的评论中

now I'm getting :java.lang.IllegalArgumentException: encoding error in getInstance: java.lang.ClassCastException: org.bouncycastle.asn1.DERTaggedObject cannot be cast to org.bouncycastle.asn1.DERIA5String

请尝试

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

相反。