使用CA颁发数字证书的Web应用签署PDF文档

3 投票
3 回答
4535 浏览
提问于 2025-04-17 05:20

想象一下,有一个用python/django写的网页应用,用户通过apache+mod_ssl和一个自定义的django认证后端,用数字证书进行身份验证。那么,他们该如何给文件签名呢?这些证书是由政府认可的证书机构发放的。

如果我没记错的话,文件需要用证书的私钥来签名,因为这才是证明文件确实是由某人签名的证据(而不是其他人假装成那个人)。

那么,一个网页应用怎么能访问存储在用户浏览器中的证书私钥呢?

这是否可以在不需要用户机器上运行软件的情况下实现?

补充:

所以这可以通过ActiveX控件或Java小程序来实现,对吧?这需要从头开发,还是有人知道现成的开源解决方案?

3 个回答

0

这听起来像是欧盟的规定。可惜的是,现在网上有数不胜数的电子签名插件。要记住,很多插件还依赖于客户端的软件(比如如果证书来自智能卡,通常还需要安装智能卡的中间件)。所以你最好先了解一下你的目标市场。

0

正如tawman在他的回答中提到的,正确的方法是在浏览器中使用一个客户端模块,让这个模块来进行实际的签名。你可以使用签名的Java小程序或者签名的ActiveX控件来完成这个工作。

我们提供这样的解决方案,用于分布式签名,并且有现成的客户端模块可以使用。不过,服务器端的部分需要使用.NET或VCL(抱歉,不支持Python)。我们的解决方案不需要把文档传到客户端(这和tawman的方案不同)——只需发送一小部分数据到客户端,然后在那里进行签名。

顺便提一下,用于通过SSL进行身份验证的客户端证书,可能不适合用来签名:这两种操作需要证书中不同的密钥使用扩展。

2

你说得对,网页应用需要访问用户电脑上或者PKI存储里的私钥。我曾经为美国空军网络开发过这样的解决方案。

用户用他们的CAC卡登录美国空军的电脑,这张卡里存有他们的PKI凭证和私钥。在我们的解决方案中,我们需要对网页应用生成的PDF文档进行数字签名。我们制作了一个ActiveX控件,它可以通过网络服务从网站上下载PDF文档,然后在本地对PDF进行数字签名,最后把签名后的PDF文档传回网站。

因为这些文档的签名权限只限于少数人,所以我们得到了使用ActiveX控件的授权。你走在正确的道路上,只有本地授权的应用才能访问用户的密钥存储。

撰写回答