在浏览器中生成客户端证书并在服务器上签名

时间:2012-02-08 16:32:51

标签: ssl ssl-certificate client-side

是否可以在浏览器中请求生成客户端密钥对,并将公钥发送到服务器CA以进行透明签名?然后在用户的浏览器中安装签名证书?

情景:

  1. 用户打开https://examle.com/网页,验证服务器身份
  2. 用户请求创建帐户
  3. 密钥对在用户的浏览器中生成,不会泄露给服务器/ CA
  4. 将Pubkey发送到服务器进行签名
  5. 服务器签名密钥并生成证书
  6. 证书将发送到客户端并与私钥一起安装在浏览器中
  7. 下次客户端连接到服务器时,将根据客户端证书验证其身份。

    如果服务器可以强制/提示客户端使用密码加密来保护他的私钥,那就太好了。

    我已经看过使用java applet进行此任务的网上银行业务。是否可以使用本机浏览器功能来实现?欢迎使用Apache / PHP或Node.js解决方案。

1 个答案:

答案 0 :(得分:16)

是的,这是可能的。但是,没有跨浏览器解决方案。

  • 对于Internet Explorer,您必须使用X509Enrollment.CX509EnrollmentWebClassFactoryCEnroll.CEnroll使用某些ActiveX控件,具体取决于它是在Windows XP还是Vista / 7上运行。这将生成PKCS#10证书请求(您可能需要在传统分隔符之间进行包装。
  • 对于其他人,您应该能够使用<keygen />标记。它是一个遗留的Netscape标签,之前不是正式的HTML,但它已经变成了HTML 5(尽管MS已经表示他们不会在它们的实现中支持它)。这将生成SPKAC结构(类似于CSR)。
  • 对于Firefox(虽然它支持keygen),您可以使用CRMF functions

Here is an example script应该完成ActiveX或Keygen的大部分工作。

当服务器返回证书(可能稍后)时,浏览器应将其导入其商店并将其与请求时生成的私钥相关联。

私钥的保护方式取决于浏览器或基础证书存储机制。例如,在Firefox中,安全设备上应该有一个主密码。

在服务器端,您可以使用各种工具实现自己的CA. OpenSSL和BouncyCastle可以处理PKCS#10和SPKAC。这是BouncyCastle-based example(与上面的脚本相关联)和some code for CRMF

如果您想要现成的解决方案,您可能会对OpenCA等感兴趣。