JSignPdf0.9.0批处理及用于Java web项目时的bug

12/18/2009来源:Java教程人气:4766

最近做的一个项目中客户有个需求,要求对给他们的客户下载的证书进行数字签名。因此,项目中用到开源项目JSignPdf 0.9.0版(以下简称:J09)实现对pdf文件的数字签名。在使用的过程中,发现了J09的一个bug。
J09声称在命令行模式(command line batch mode)下可以实现批处理操作,其中,有一个参数“-ka”用于指定密钥文件(keystore file)中的密钥别名(key alias),若不指定则默认取文件中的第一个密钥。
环境:密钥文件使用Adobe pdf Reader 9生成,类型为PKCS12(.pfx文件);后面说的java web项目基于Struts2 + SPRing框架,将J09的入口类Signer做简单修改后作为Action类的成员变量,模拟命令行参数实现对pdf文件进行数字签名。
问题:当执行批处理(参数中有多个待签名pdf文件),同时又指定了“-ka”参数(如“-ka 1”,此时理论上应该和不指定该参数是一样的,但实际上不一样)时,对第一个pdf文件签名一切正常,到第二个的时候就抛出如下异常
java.lang.NullPointerException
        at com.lowagie.text.pdf.PdfPKCS7.<init>(Unknown Source)
        at com.lowagie.text.pdf.PdfSigGenericPKCS.setSignInfo(Unknown Source)
        at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(Unknown Source)
        at com.lowagie.text.pdf.PdfSignatureAppearance.preClose(Unknown Source)
        at com.lowagie.text.pdf.PdfStamper.close(Unknown Source)
        at net.sf.jsignpdf.SignerLogic.run(SignerLogic.java:168)
        at net.sf.jsignpdf.Signer.signFiles(Signer.java:120)
        at net.sf.jsignpdf.Signer.main(Signer.java:68)
而只有不指定“-ka”参数时,才能实现真正的批处理操作。因此,要想实现批处理,一定不能指定-ka参数,此时意味着密钥文件中只能有一个密钥(严格地说应该是只能使用密钥文件中的第一个密钥)。

以上是在Windows命令行下直接使用其jar包的情况。而当把J09源码用于应用了Struts2+Spring框架的Java web项目时(Spring 版本2.5,对于其他情况,本人没有实践无发言权),则无论如何一定不能指定“-ka”参数,否则即使一次只签名一个文件,到第二次签名操作时,一定会抛出上述异常,即使每次操作都将整个类重新new一个也无法幸免!(呵呵,如果不嫌麻烦,每签名一次就将项目重启一次,这


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/notjusttech/archive/2009/12/17/5028184.aspx