我知道已经有很多关于这个主题的不同主题,但我真的找不到我要找的东西。
我的国家有一项服务,可以使用电话号码和密码为 PDF 提供数字签名(您必须注册此服务)。不管怎样,有一个WebService——它的文档非常少——而且我能够使用这个服务。使用我的电话号码和密码发送请求后,我会收到数字签名的响应。
但问题是我没有收到签名的 PDF,我只收到原始 PDF、X.509 证书和摘要等。
我的问题是,如何将摘要和证书添加到PDF中,以便普通PDF阅读器可以识别签名?
以下是数字签名服务如何工作的简短描述:
我卡在第 4 步了。
这是使用测试 PDF 的示例请求的
XMLResposne
(摘要和证书被剪掉):
<?xml version="1.0" encoding="UTF-8"?>
<sl:CreateXMLSignatureResponse xmlns:sl="...">
<dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" Id="signature-1-1">
<dsig:SignedInfo>
<dsig:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<dsig:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256" />
<dsig:Reference Id="reference-1-1" URI="#signed-data-1-1">
<dsig:Transforms>
<dsig:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
<xpf:XPath xmlns:xpf="http://www.w3.org/2002/06/xmldsig-filter2" Filter="intersect">id('signed-data-1-1')/node()</xpf:XPath>
</dsig:Transform>
<dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#base64" />
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<dsig:DigestValue>[some digest]</dsig:DigestValue>
</dsig:Reference>
<dsig:Reference Id="etsi-data-reference-1-1" Type="http://uri.etsi.org/01903#SignedProperties" URI="#etsi-signedproperties-1-1">
<dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<dsig:DigestValue>[some digest]</dsig:DigestValue>
</dsig:Reference>
</dsig:SignedInfo>
<dsig:SignatureValue Id="signaturevalue-1-1">[some base64 value]</dsig:SignatureValue>
<dsig:KeyInfo>
<dsig:X509Data>
<dsig:X509Certificate>[some base64 value]</dsig:X509Certificate>
</dsig:X509Data>
</dsig:KeyInfo>
<dsig:Object Id="signed-data-1-1">[the original PDF as base64, not signed]</dsig:Object>
<dsig:Object Id="etsi-signed-1-1">
<etsi:QualifyingProperties xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Target="#signature-1-1">
<etsi:SignedProperties Id="etsi-signedproperties-1-1">
<etsi:SignedSignatureProperties>
<etsi:SigningTime>2020-06-04T14:00:22Z</etsi:SigningTime>
<etsi:SigningCertificate>
<etsi:Cert>
<etsi:CertDigest>
<dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
<dsig:DigestValue>[some digest]</dsig:DigestValue>
</etsi:CertDigest>
<etsi:IssuerSerial>
<dsig:X509IssuerName>[issuer name]</dsig:X509IssuerName>
<dsig:X509SerialNumber>[serial no]</dsig:X509SerialNumber>
</etsi:IssuerSerial>
</etsi:Cert>
</etsi:SigningCertificate>
<etsi:SignaturePolicyIdentifier>
<etsi:SignaturePolicyImplied />
</etsi:SignaturePolicyIdentifier>
</etsi:SignedSignatureProperties>
<etsi:SignedDataObjectProperties>
<etsi:DataObjectFormat ObjectReference="#reference-1-1">
<etsi:MimeType>application/pdf</etsi:MimeType>
</etsi:DataObjectFormat>
</etsi:SignedDataObjectProperties>
</etsi:SignedProperties>
</etsi:QualifyingProperties>
</dsig:Object>
</dsig:Signature>
</sl:CreateXMLSignatureResponse>
我构建了一个这样的工具来使用特定的 X.509 认证对 PDF 进行签名。 顺便说一句,您不必每次都申请 X.509 认证。您可以自己生成。
步骤如下:
安装
openssl
、python3
、pip
在控制台中运行命令:
pip install pyhanko[opentype]
。
从 https://github.com/Micraow/pdf_signer 下载代码或将
stamp.py
保存到您的计算机。
文件开头附近有一些字段。改变它们。
奔跑
python stamp.py
关于如何生成自己的认证等信息,请阅读此:https://pengs.top/pdf-sign/