【问题标题】:Digitally sign pdfs对 pdf 进行数字签名
【发布时间】:2010-09-30 00:12:21
【问题描述】:

我的公司有一个 Web 文档管理应用程序,我被指派寻找一种使用用户数字证书签署 pdf 文件的方法。

pdf 可以从几 kb 到超过 100Mb,这是通过 Internet 进行的,因此签名必须在网络服务器上进行。

为了做到这一点,我构建了一个 activeX 控件,它要求用户选择证书,然后使用 WebClient.UploadData 将其上传到网页,将证书作为字节数组发送。

在网页上,当我尝试签署 pdf 文档时,我收到一个错误“密钥不存在”。这对我来说并不奇怪,因为当我在选择正确的证书后直接通过 https 连接使用证书时,我会提示输入密钥。 activeX 不会发生这种情况。

这就是我从用户那里获取证书的方式:

private static X509Certificate2 PickCertificate()
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            try
            {
                store.Open(OpenFlags.ReadOnly);

                // pick a certificate from the store
                X509Certificate2 cert = X509Certificate2UI.SelectFromCollection(store.Certificates, "Title", "Message", X509SelectionFlag.SingleSelection)[0];

                // show certificate details dialog
                X509Certificate2UI.DisplayCertificate(cert);
                store.Close();
                return cert;
            }
            finally { store.Close(); }
        }

如何要求用户提供我丢失的密钥?

【问题讨论】:

  • 现代浏览器不支持 java applet 或 activeX 解决方案。使用任何或可用的浏览器扩展进行数字签名。 Signer.Digital Chrome 扩展程序就是这样一款免费的扩展程序。请参考答案stackoverflow.com/a/55676351/9659885
  • 是的...这是一个 10 年前的问题...
  • 嗯......是的,这就是原因,我根据新的发展和背景添加了这个评论......(为了获得一些支持......!:P)

标签: digital-signature digital-certificate


【解决方案1】:

您希望用户将其证书的私钥上传到网络服务器,以便它可以签署 PDF?如果是这样,从安全角度来看,这从根本上被打破了。

我认为您可能错过了公共证书!= 私钥这一点。 (我们大多数人都很草率,使用“证书”这个词来指代其中任何一个(或两个),所以这并不完全令人惊讶)。根据记忆,CryptoAPI 只有一组允许您访问密钥的方法。其中必须有一种“导出为 PFX”的方法,所以如果你真的、真的想要,你可以让你的设计工作,但我没有办法推荐这个。 (将私钥发送到网络服务器的风险、破坏的不可否认性等)。

如果你真的必须在服务器上做签名[我不太明白你的说法,签名不应该给上传添加太多数据],那么你可能应该考虑多层架构,以及密钥托管机制.这样您至少可以最大限度地减少一些安全问题(但您仍然会失去不可否认性......并引入其他风险。这里没有免费的午餐)。

所以...您可能需要考虑重新构建您的应用程序,以便在上传 PDF 文件之前在客户端(在您的 ActiveX 控件中)发生 PDF 签名。我想您将需要一个用于签名步骤的第三方库,如this SO thread 中所述。

【讨论】:

  • 以前的 pdf 签名版本在客户端工作。当您想要签署一个 100Mb 的文档时,这是一个问题,因为您必须通过网络上传它。想象一下 15kb/秒的上传连接需要多长时间...
  • 下载/签名/上传?我知道了。然后,您要么需要将密钥文件发送到服务器,这很危险,要么实施托管系统(这将需要工作,甚至可能无法实现,具体取决于您的目标受众)。两种情况下的法律(责任)影响。
  • 我正在从智能卡获取证书。您对我如何获得钥匙有任何想法吗?
  • 在这种情况下你可能不走运。无法访问私钥是设计标准之一。
猜你喜欢
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2011-06-14
  • 2015-06-20
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多