我想使用存储在USB令牌,HSM等上的证书对PDF文件进行数字签名。如何使用JAVA使用存储在USB令牌上的私钥?
答案 0 :(得分:8)
要iText自我引用,我会添加
答案 1 :(得分:7)
将数字签名添加到PDF文件中涉及的步骤:
(I)创建模板PDFDocument:
使用模板签名创建PDF文档:
PDSignature pdSignature;
pdSignature.setByteRange(new int[]{0, 0, 0, 0});
pdSignature.setContents(new byte[n*1024]);
其中n是整数,即kbs的倍数。
注意:内容大小应大于或等于签名和证书文件的长度之和。
(II)更新模板PDF Docuement:
(a)更新/ ByteRange [a b c d]:
(i)a =“%PDF”中的偏移%(默认情况下= 0)
(ii)b =偏移&lt;在“/Contents<000...000>”中
(iii)c =偏移量>在“/Contents<000...000>”中
(iv)d =“%% EOF”中的F偏移减去上面的c
(b)更新外部参照部分:
更新交叉引用表(外部参照部分),指定对象的位置和
(c)更新startxref部分:
update startxref,它是交叉引用表(xref)的起始偏移量。
(III)生成更新的模板文档的数字签名:
生成更新的模板文档,不包括“/ Contents&lt; 000 ... 000&gt;”的临时签名数据(“000 ... 000”)
(IV)更新内容&lt;&gt;部分:的
在“/Contents&lt; 000...000&gt;”中替换签名数据长度的第一个/初始“0”使用模板PDFFile的签名数据(Enveloped)。
建议:
使用PDFBox的SignatureInterface:
(a)实现SignatureInterface以调用sign()方法 (b)提供输入,输出文件,密钥库,别名,引脚 (c)保存实施
(或)使用任何java pdf库(如iText ...)
(或)自己在Java中实施步骤I-IV。
答案 2 :(得分:4)
似乎您希望使用USB令牌,智能卡或硬件安全模块对PDF进行数字签名。这是通过PK {#11完成的,如http://itextpdf.com/book/digitalsignatures中所述。您可以找到源代码here。 This是一个示例,说明如何使用SafeNet iKey 400 USB令牌进行签名。