如何使用浏览器中的证书私钥对文档进行签名(CAPICOM 替代方案)?

How to sign the document with a certificate's private key from the browser (CAPICOM alternative)?

所以,直到 Windows7 才有了一个 Microsoft ActiveX 组件:CAPICOM,可以从 Javascript 调用它,然后显示客户端机器上证书存储的内容。然后客户端可以选择适当的证书并使用证书的私钥签署一些文档。 这就是在 Javascript:

中访问证书存储的方式
var MyStore = new ActiveXObject("CAPICOM.Store");
var oCertificates = new ActiveXObject("CAPICOM.Certificates");
// attempt to open the personal certificate store   
MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);

现在除了使用 CAPICOM 之外还有什么选择?我希望客户端能够在浏览器 中使用他的私钥 对一些文本进行签名,然后将带有 public 密钥的签名文本发送到服务器。还有可能吗?

也许我可以使用 Java 或 Silverlight 而不是纯 JavaScript? PKI.js 和类似的呢?

一般来说,目前无法,因为浏览器不支持 Java 或 silverlight。

Chrome 已放弃对 NPAPI 插件的支持。 Firefox 已宣布将在 2017 年停止使用,Edge 不支持。 Microsoft 已弃用 Silverlight,Oracle 也宣布弃用 Java 浏览器插件。只能用旧版IE。

JavaPKI.js, forge or the built-in WebCryptographyApi 等脚本加密库可用于执行数字签名,但它们无法访问操作系统密钥库,所以您无法访问已安装的证书

备选方案(不太令人鼓舞):

  • 使用 WebCryptographyApi 在浏览器中加载证书(不适用于智能卡)
  • 启动安装在您设备上的 本地应用程序 并通过协议调用,使用嵌入式 http 服务器或使用 chrome 消息传递 api
  • 请耐心等待 Key Discovery Api,这将为 WebCrypto
  • 提供对 OS 密钥库的访问权限

事实上,我已经创建了一个 .NET ActiveX 对象,并使用 X509Certificate2UI class 和同一名称空间中的其他对象来显示有关证书的信息并签署一些数据。

优点:无需使用 CAPICOM。

缺点:它仍然是一个 ActiveX 组件,因此只能在 Internet Explorer 中使用。

但这对我的客户来说没问题,所以我选择了这条路。