好的,我正在尝试执行针对iText(7)和BouncyCastle(154)jar文件编译的测试Java程序。一切都在游泳,直到我在调用signDetached函数时尝试添加OCSP响应。
我的代码基本上是来自iText网站的这段代码:
在必要时更换证书和密码详细信息。这一切都可以编译好但是当我运行它时,Java代码会出现以下错误:
线程中的异常" main" java.lang.NoClassDefFoundError: org.bouncycastle.ocsp.RevokedStatus at com.itextpdf.signatures.OcspClientBouncyCastle.getEncoded(OcspClientBouncyCastle.java:148) at com.itextpdf.signatures.PdfSigner.signDetached(PdfSigner.java:510) 在DECSignHello.DoSign(DECSignHello.java:314)at DECSignHello.main(DECSignHello.java:125)引起: java.lang.ClassNotFoundException:org.bouncycastle.ocsp.RevokedStatus 在java.net.URLClassLoader.findClass(URLClassLoader.java:600)at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:777)at java.lang.ClassLoader.loadClass(ClassLoader.java:750)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:326)at at java.lang.ClassLoader.loadClass(ClassLoader.java:731)... 4更多
当我深入挖掘时,我发现iText7正在使用一个名为OcspClientBouncyCastle
的java类,它引用了一个更古老的BouncyCastle实现的类文件(在151之前的东西 - 没有确切地确定哪个版本它还包含这个类)。它引用的类是org.bouncycastle.ocsp.RevokedStatus
。导致问题的代码是:
status instanceof org.bouncycastle.ocsp.RevokedStatus
OcspClientBouncyCastle.java
的第148行。它不存在于151及以上的任何BouncyCastle jar文件中......
相同的iText类OcspClientBouncyCastle.java
文件似乎也使用路径org.bouncycastle.cert.ocsp.*
中找到的更新的BouncyCastle类来处理BouncyCastle相关的所有其他内容,因此看起来好像它使用了两个不同的BouncyCastle实现。至少这对我来说是什么样的。
导致我的OCSP测试失败,因为当我收到来自我的服务提供商的无效OCSP响应时(因为我使用的是已撤销的证书来测试),{I引用的类在类路径中找不到{1}}源代码 - 所以它都会因无法解决的错误而崩溃。
现在,我可以通过使用154 BouncyCastle实现中的有效类进行手动OCSP验证来解决这个问题,如下所示:
BasicOCSPResp l_resp = l_ocsp_client.getBasicOCSPResp(l_other_cert, l_root_cert, l_ocsp_url); SingleResp[] l_response = l_resp.getResponses();
依旧......
但是,只要我使用iText7 OcspClientBouncyCastle.java
函数(传递和PdfSigner.signDetached
的实例作为OCSP客户端参数),就会调用OcspClientBouncyCastle
代码并且'老'使用了类。
我想我可以通过在我的类路径中包含较旧的(尚未识别的)BouncyCastle jar文件来解决该错误,但这似乎是一个混乱的解决方案。
我还可以编辑OcspClientBouncyCastle.java
文件并更正错误的函数以使用更新的BouncyCastle函数实现,但这似乎也有点过分了。
我应该提一下,我在命令行上的AIX环境中工作。所以没有Java开发工具/环境 - 只需OcspClientBouncyCastle.java
,我手动构建我的类路径(在编译和运行时)并使用ksh shell脚本执行我的代码。
所以,经过所有这些,我想我的问题是:有人能想出iText以这种方式实现类vi
的合理理由吗?
我是这个论坛的长期关注者/用户,但这是我第一次发帖。我意识到我的问题'范围相当广泛,所以要事先道歉。
以下是示例代码:
OcspClientBouncyCastle