写在前面
一般情况下我们都是使用iText7自带的
1 | 复制代码pdfsigner.detach() |
方法对pdf文件进行签名,iText7已经自己封装好了PKC7,所以这里还是挺方便的。但如果因为某种需求需要我们自己来进行P7签名,那么我们就可以使用
1 | 复制代码pdfsigner.signExternalContainer() |
来自己实现对pdf的签名,即itext7只要提供要签名的数据给我们就行了。
签名和验签大致流程
我们可以看下这幅图,来自《Acrobat_DigitalSignatures_in_PDF》:
大致的意思就是说
- 要签名的时候会把文档转换成字节流叫ByteRange
- ByteRange有四个数字,分成三部分(以图为例),我们要用来签名的数据就在0- 840和960-1200这部分,然后签名就存放在840~960里面。
- 因此我们验签的时候获取签名值就来自于840~960也就是Contents里。
- 要验签的原文就是ByteRange里除去签名值的部分。
IExternalSignatureContainer介绍
我们先看下IExternalSignatureContainer这个接口:
1 | 复制代码/** |
signExternalContainer()方法介绍
接下来我们看下需要用到IExternalSignatureContainer 的方法 signExternalContainer() 的介绍:
1 | 复制代码 /** |
可以看到这个方法需要两个参数IExternalSignatureContainer(扩展签名容器) 和 estimatedSize(预估值)。
开始重写IExternalSignatureContainer
那么我们先重写IExternalSignatureContainer:
注:以下使用到的哈希方法,签名方法是做一个说明,毕竟要用到IExternalSignatureContainer表示你已经是有了自己的一套哈希和签名工具了
在进行签名的时候有两个subFilter可以然后我们进行使用,分别是adbe.pkcs7.detached和adbe.pkcs7.sha1,在pdf1.7文档里的解释是
adbe.pkcs7.detached: No data is encapsulated in the PKCS#7 signed-data field.
adbe.pkcs7.sha1: The SHA1 digest of the byte range is encapsulated in the PKCS#7 signed-data field with ContentInfo of type Data.
adbe.pkcs7.detached是目前用得最多的,在这里我们直接将数据进行p7不带原文签名即可;
adbe.pkcs7.sha1则是先对数据进行哈希,然后再调用p7带原文签名。不过这种应该是后来的标准里被废除了。
Adbe.pkcs7.detached
1 | 复制代码IExternalSignatureContainer externalP7DetachSignatureContainer = new IExternalSignatureContainer() { |
Adbe.pkcs7.sha1
1 | 复制代码IExternalSignatureContainer externalP7Sha1SignatureContainer = new IExternalSignatureContainer() { |
调用signExternalContainer()方法
1 | 复制代码PdfReader pdfReader = new PdfReader(new ByteArrayInputStream(pdfFile)); |
如改成这样:
1 | 复制代码 //是否签名成功标志 |
盖章
假设我们现在需要为文件进行盖章,我们可以准备一张图章图片,将它添加到签名域里。
1 | 复制代码 /** |
验签
用我们的自己的签名工具进行签名后,我们可以更进一步的做验签。
Adbe.pkcs7.detached验签
1 | 复制代码 /** |
Adbe.pkcs7.sha1验签
1 | 复制代码 /** |
获取源数据和签名数据方法
1 | 复制代码 /** |
获取签名信息
当我们对pdf进行签名后,可以获取到这份pdf里的签名信息。
1 | 复制代码/** |
1 | 复制代码 /** |
参考
How can I get ByteRange with iText7?
C2_07_SignatureAppearances.java
Why I can’t use SHA1 before PKCS7.detached in iText7?
本文转载自: 掘金