在服务器上数字签署PDF

5
我有一个项目需要在ASP.NET (C#)服务器上生成PDF文件。但现在我们需要让客户能够数字签名这些PDF文件。从我所看到的情况来看,必须在客户端使用小应用程序对文档进行签名,因为在服务器上我无法访问证书的私钥,但正如我上面所说,PDF文件是在服务器上生成并保存的。
因此,我需要在服务器上使用客户端证书进行数字签名PDF文件。
谢谢

1
您的服务器上的pdf组件应该能够支持提供pdf哈希,并将从浏览器接收到的签名容器注入回pdf文件。在浏览器端,使用Signer.Digital Chrome扩展程序(披露:由我的公司免费提供)或任何可以将签名值返回给服务器的浏览器扩展程序,在那里pdf组件将签名注入回pdf文档。请参阅https://dev59.com/WFwX5IYBdhLWcg3w8TIf#55676351。 - Bharat Vasant
@Hernan 我们有一个类似的用例。用户使用浏览器向我们的应用程序输入数据。在他输入数据后,用户必须确认他对所输入的数据负责,并通过数字签名来证明。我们可以通过提示用户下载 PDF 文件,在其 PC 上签署并再次上传来完成此操作。但是,我们如何确保/澄清用户是否已签署了文档?你采取了哪种方式? - surfmuggle
4个回答

3
由于无法提取并发送客户端的私钥,因此要在服务器上签署pdf,您需要与客户端建立“会话”,让他们计算签名。
步骤应该是:
1. 客户端发送公共证书以嵌入签名的pdf中 2. 服务器生成pdf,嵌入证书并计算哈希(例如:sha1) 3. 服务器将哈希发送到客户端小程序 4. 小程序使用其私钥计算数字签名 5. 小程序将签名发送到服务器 6. 服务器嵌入数字签名并关闭pdf。
要使用itext进行此操作,您需要在嵌入证书后使用preclose方法,以便能够计算最终文档的sha1哈希值。然后,在预关闭pdf之后,您将必须计算pdf的哈希值并将其发送给客户端。请注意:在预关闭期间,您将必须将文档保留在内存中,例如在服务器会话中。
要生成pdf、嵌入证书和准备文档,您可以使用itextsharp,即itext库的c#端口。要计算哈希并创建pkcs7信封,您可以使用.net加密api。
希望这可以帮助到您。

2
你可能忽略了数字签名文档的重点。签署文档的行为意味着这是用户活动。 你可以在服务器端创建文件,使用“application/pdf”内容类型进行服务,以便签署文件。当他们签署时,您可以使用pdf表单提交将签署后的文档提交回服务器。

嗨,感谢回复。是的,我正在阅读这个内容,但想知道在服务器上没有这样做的可能性,将PDF下载到客户端是不可行的。工作环境是一个使用Active Directory的内部网络。 - Hernan
你可以使用像http://itextpdf.com/这样的工具(Java工具,我认为有一个.NET端口)来编程地创建PDF文档,并向PDF文档应用证书和签名字段。你也可以编程地对文档进行签名。有很多关于如何做到这一点的例子。快速的谷歌搜索结果是这个(同样是Java)http://itextpdf.sourceforge.net/howtosign.html。 - maple_shaft
1
话虽如此,我强烈建议您根据客户需求重新评估您的要求。数字签名是作为用户活动而存在的,因为它们识别用户,确认用户已阅读并同意文件,并验证文档的真实性。然后可以根据证书验证用户提供的签名以验证其真实性。如果您在服务器上编程创建文档、应用证书和签署文档,则数字证书的目标就被击败了。Joe Hacker也可能会创建这样一个虚假的文档。 - maple_shaft

0

您还可以使用签名服务,例如(很抱歉,我只知道这个可行)http://www.signagate.de - 这些人提供了一个Web服务,使您能够“上传”未签名的PDF文件,该文件将返回带有所谓的“中间”签名,符合欧盟所有签名法规的资格签名(至少对于发票而言)。

有趣的是,您只需要能够调用他们的服务来获取已签名的PDF作为答案即可。

因此,“中间”事物允许您(从法律角度)不在全球范围内推广私钥等内容,但通过对该公司签名服务进行适当身份验证,获得PDF的有效签名并保持法律需求。

Jimmy


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接