最近做的一個項目中客戶有個需求,要求對給他們的客戶下載的證書進行數字簽名。因此,項目中用到開源項目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參數,此時意味著密鑰文件中只能有一個密鑰(嚴格地說應該是只能使用密鑰文件中的第一個密鑰)。