我想使用存储在USB令牌、HSM等设备中的证书对PDF文件进行数字签名。如何使用JAVA调用存储在USB令牌上的私钥?
我想使用存储在USB令牌、HSM等设备中的证书对PDF文件进行数字签名。如何使用JAVA调用存储在USB令牌上的私钥?
除了iText自身之外,我还会添加以下内容:
添加数字签名到PDF文件的步骤:
(I) 创建模板PDF文档:
创建带有模板签名的PDF文档:
PDSignature pdSignature;
pdSignature.setByteRange(new int[]{0, 0, 0, 0});
pdSignature.setContents(new byte[n*1024]);
其中n是整数,即kb的倍数。
注意:内容大小应大于或等于签名和证书文件长度之和。
(II)更新模板PDF文档:
(a) 更新/ByteRange[a b c d]:
(i) a=“%PDF”中“%”的偏移量(默认为0)
(ii) b=“/Contents<000...000>”中“<”的偏移量
(iii) c=“/Contents<000...000>”中“>”的偏移量
(iv) d=“%%EOF”中“F”的偏移量减去上述c值
(b) 更新xref部分:
更新描述对象位置的交叉引用表(xref部分)
(c) 更新startxref部分:
更新startxref,即交叉引用表(xref)开头的偏移量。
(III)生成更新后模板文件的数字签名:
生成更新后的模板文件数字签名,不包括“/Contents<000...000>”中的临时签名数据(“000...000”)
(IV) 更新Content<>部分:
将“/Contents<000...000>”中签名数据长度的第一个/初始“0”替换为模板PDF文件的签名数据(加密)。
建议:
使用PDFBox的SignatureInterface:
(a) 实现SignatureInterface以调用sign()方法 (b) 提供输入、输出文件、密钥库、别名、PIN (c) 进行保存增量
(或者)使用任何Java PDF库(如iText…)
(或者)自己用Java实现步骤I-IV。