Base64 摘要 + PFX(PKCS12)-> ETSI.CAdES.分离签名 ->帕德斯生命周期价值
我有一个 API 可以创建 PDF 文档的 Base64 摘要。 现在我想创建另一个 API,它采用此摘要和 PFX 并创建 ETSI.CAdES.detached 签名并采用 LTV 信息(证书链、OCSP 响应、CRL),我想将其嵌入到 PDF 中以获得 PAdES-LTV 签名使用第三个 API(我的第三个 API 将采用从此 API 获得的 CAdES 签名和 LTV 信息,并将它们嵌入到我的 PDF 中)。我不知道如何创建这个ETSI.CAdES.detached 签名使用该摘要以及带有 Java 和 Bouncy Castle 的 PFX。我尝试遵循此 github 教程。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
正如您所声明的,您有自己的代码来准备 PDF 进行签名并将签名容器注入其中。因此,你的问题基本上可以归结为
iText 7 签名框架中的实现
由于我没有您现有的代码,因此我必须使用不同的框架进行测试。我为此使用了 iText 7 签名框架。
BouncyCastle 确实包含一个
CMSSignedDataGenerator
来生成 CMS 签名容器。不幸的是,其中 SignerInfo 生成的默认实现与 CAdES/PAdES 不兼容,因为它不创建签名的 ESSCertID[v2] 属性。不过幸运的是,该实现的设计允许插入自定义属性集。
因此,您可以使用自定义的 CMSSignedDataGenerator 创建 PAdES BASELINE 签名所需的 CAdES 容器。
因此,当您准备好要签名的 PDF 后,您可以像这样继续:
(PadesSignatureContainerBc 方法
sign
)byte[] cmsBytes
包含要注入到准备好的 PDF 签名占位符中的字节。需要以下帮助器类:
首先,
InputStream
的包装器包含要由 BouncyCastle 签名处理的 PDF 范围。(PadesSignatureContainerBc 辅助类
CMSTypedDataInputStream
)然后是自定义的签名属性生成器对于 PAdES:
(PadesSignatureContainerBc 辅助类
PadesSignedAttributeGenerator
)最后是用于签名时间戳的自定义无符号属性生成器:
(PadesSignatureContainerBc 辅助类
PadesUnsignedAttributeGenerator
)这里我假设一个
ITSAClient tsaClient
,一个 iText 7 时间戳请求客户端。您当然可以使用您选择的任意 RFC 3161 时间戳请求客户端。如果您已将私钥读入 JCA/JCE
PrivateKey pk
,则只需使用 BouncyCastleJcaContentSignerBuilder
创建所需的ContentSigner contentSigner
,例如像这样:(比较 testSignPadesBaselineT href="https://github.com/mkl-public/testarea-itext7/blob/master/src/test/java/mkl/testarea/itext7/signature/SignPadesBc.java#L65" rel="nofollow noreferrer"> SignPadesBc)
PDFBox 3 签名框架中的实现
同时,您在评论中指出您正在考虑使用 PDFBox 进行签名。幸运的是,上面提供的代码几乎不需要任何更改就可以与 PDFBox 一起使用。
要将上面的代码与 PDFBox 一起使用,只需将其包装到 PDFBox
SignatureInterface
框架中即可:( PDFBox PadesSignatureContainerBc
SignatureInterface
的实现)你可以像这样使用它
(PDFBox SignPadesBc 测试
testSignPadesBaselineT
)As you have declared, you have your own code for preparing a PDF for signing and for injecting the signature container into it. Thus, your question essentially burns down to
Implementation in the iText 7 Signing Framework
As I do not have your existing code, I had to use a different framework for my tests. I used the iText 7 signing framework for that.
BouncyCastle does contain a
CMSSignedDataGenerator
to generate CMS signature containers.The default implementation of the SignerInfo generation therein unfortunately is not CAdES/PAdES compatible as it does not create signed ESSCertID[v2] attributes. Fortunately, though, the implementation is designed to allow plugging in custom attributes sets.
Thus, you can create the CAdES containers required for PAdES BASELINE signatures with a customized
CMSSignedDataGenerator
.So when you have prepared the PDF for signing, you can proceed like this:
(PadesSignatureContainerBc method
sign
)The
byte[] cmsBytes
contains the bytes to inject into the prepared PDF signature placeholder.The following helper classes are needed:
First of all a wrapper for the
InputStream
containing the PDF ranges to sign to process by BouncyCastle.(PadesSignatureContainerBc helper class
CMSTypedDataInputStream
)Then a customized signed attributes generator for PAdES:
(PadesSignatureContainerBc helper class
PadesSignedAttributeGenerator
)And finally a customized unsigned attributes generator for a signature timestamp:
(PadesSignatureContainerBc helper class
PadesUnsignedAttributeGenerator
)Here I assume a
ITSAClient tsaClient
, an iText 7 time stamp request client. You can of course use an arbitrary RFC 3161 time stamp request client of your choice.If you have read your private key into a JCA/JCE
PrivateKey pk
, you can simply create the neededContentSigner contentSigner
using the BouncyCastleJcaContentSignerBuilder
, e.g. like this:(compare the test
testSignPadesBaselineT
in SignPadesBc)Implementation in the PDFBox 3 Signing Framework
You meanwhile indicated in comments that you're looking into using PDFBox to sign. Fortunately the code presented above can nearly without a change be used with PDFBox.
To use the code above with PDFBox, one merely has to wrap it into a PDFBox
SignatureInterface
frame:(PDFBox PadesSignatureContainerBc implementation of
SignatureInterface
)You can use it like this
(PDFBox SignPadesBc test
testSignPadesBaselineT
)