11

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?

4

3 回答 3

9

对于iText自引用,我将添加

于 2014-01-08T22:31:17.740 回答
8

将数字签名添加到 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。

于 2014-03-10T11:46:45.380 回答
4

似乎您想使用 USB 令牌、智能卡或硬件安全模块对 PDF 进行数字签名。这是通过 PKCS#11 完成的,如http://itextpdf.com/book/digitalsignatures中所述。您可以在此处找到源代码。是一个示例,展示了如何使用 SafeNet iKey 400 USB 令牌进行签名。

于 2013-07-09T15:38:15.253 回答