I want to digitally sign a PDF file using a certificate stored on a USB-token, HSM, etc. How do I use the private key stored on the USB token using JAVA?
3 回答
对于iText自引用,我将添加
- 诺斯底派
- 数字签名器
- Apache PDFBox(开源)
- Java4Less(开源,基于 PDFBox)
- Adobe LiveCycle
- jPDFSecure
- 甲骨文融合
将数字签名添加到 PDF 文件所涉及的步骤:
(I) 创建模板 PDFDocument :
创建带有模板签名的 PDFDocument:
PDSignature pdSignature;
pdSignature.setByteRange(new int[]{0, 0, 0, 0});
pdSignature.setContents(new byte[n*1024]);
其中n是一个整数,即kbs的倍数。
注意:内容大小应大于或等于签名和证书文件长度之和。
(II) 更新模板PDF文件:
(a) 更新 /ByteRange[abcd]:
(i) a= "%PDF" 中 % 的偏移量(默认为 =0)
(ii) b= "/Contents<000...000>" 中 < 的偏移量
(iii) c= "/Contents<000...000>" 中 > 的
偏移量 (iv) d= "%%EOF" 中 F 的偏移量减去 c 从上面
(b) 更新外部参照部分:
更新交叉引用表(外部参照部分),指定对象的位置和
(c) 更新起始外部参照部分:
更新起始外部参照,即交叉引用表(外部参照)起始的偏移量。
(三)生成更新模板文档的数字签名:
生成更新模板文档,不包括“/Contents<000...000>”的临时签名数据(“000...000”)
(IV) 更新 Content<> 部分:
将“/Contents<000...000>”中的签名数据长度的第一个/初始“0”替换为模板 PDFFile 的签名数据(包络)。
建议:
使用 PDFBox 的 SignatureInterface :
(a) 实现 SignatureInterface 以调用 sign() 方法 (b) 提供输入、输出文件、密钥库、别名、引脚 (c) 保存增量
(或)使用任何 java pdf 库(如 iText ...)
(或)自己在 java 中实现步骤 I-IV。
似乎您想使用 USB 令牌、智能卡或硬件安全模块对 PDF 进行数字签名。这是通过 PKCS#11 完成的,如http://itextpdf.com/book/digitalsignatures中所述。您可以在此处找到源代码。这是一个示例,展示了如何使用 SafeNet iKey 400 USB 令牌进行签名。