我的特定用例是我必须访问存储在客户端上的数字证书,并使用它们在客户端和服务器端执行签名、验证、加密和解密的任务。对于后面的部分,有很多很多的解决方案。症结在于能够访问存储在客户端上的证书。
请注意,我说的是“存储在客户端上的证书”,这是故意含糊不清的。我不想将想法限制在系统存储、用户存储、浏览器存储、加密令牌、java 密钥存储等任何地方。
多年来,我使用了以下方法。在他们每个人旁边,我给出了优点和缺点。
- CAPICOM/ActiveX。虽然这是最容易使用的,但它限制了用户在 Windows 上使用 IE。更糟糕的是,它现在已被弃用,仅适用于 32 位。
- Java 小程序。这是跨平台和跨浏览器的,但浏览器中的 java 并不像人们希望的那样普遍,并且正在迅速消失(显然 Apple 最近删除了它)。因此,让用户下载和安装 JRE 更加麻烦。此外,用户必须执行相对技术性的任务,即为签名者设置无限强度的加密扩展才能工作。
我听说过/想到过但进展不大的事情
- 大多数 JavaScript 解决方案。他们实现了 RSA 算法,但他们没有办法访问客户端证书存储中的数字证书。他们中的大多数会生成一个新的密钥对。
- 闪光/弹性。Flash/flex 似乎是最普遍的客户端技术。他们已经可以访问摄像头和麦克风等客户端硬件。如果他们可以访问证书存储区,那就太好了。
- 微软网站上给出的 CAPICOM 的替代方案。它规定了 CAPICOM 的替代方案,这些替代方案主要是使用 .NET 框架做事。这对于桌面客户端非常有用。但是对于“脚本”,他们在“重要说明”中非常清楚地说明您必须编写自己的 activex 控件。这让我们回到了第一方。
我正在寻找的是一种方法来克服/解决访问客户端上的证书存储的主要问题。我不是在寻找关于 RSA 算法的讨论,或者为什么 PKI 是愚蠢的,或者是非对称加密的替代方案,或者使用 Web 应用程序以外的架构,或者在 Apple 上。