首页 文章

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

提问于
浏览
15

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

场景:

  • 用户打开https://examle.com/网页,验证服务器身份

  • 用户请求创建帐户

  • 密钥对在用户的浏览器中生成,不会泄露给服务器/ CA.

  • 将Pubkey发送到服务器进行签名

  • Server签名密钥并生成证书

  • 证书被发送到客户端并与私钥一起安装在浏览器中

客户端下次连接到服务器时,将根据客户端证书验证其身份 .

如果服务器可以使用密码加密强制/提示客户端保护其私钥,那将是很好的 .

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

1 回答

  • 16

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

    • 对于Internet Explorer,您必须使用 X509Enrollment.CX509EnrollmentWebClassFactoryCEnroll.CEnroll 来使用某些ActiveX控件,具体取决于它是在Windows XP还是Vista / 7上运行 . 这将生成PKCS#10证书请求(您可能需要在传统分隔符之间进行包装) .

    • 对于其余部分,您应该能够使用 <keygen /> 标记 . 它's a legacy Netscape tag, not officially HTML before, but it has made it into HTML 5 (although MS have said they wouldn' t在它们的实现中支持它) . 这将生成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这样的东西感兴趣 .

相关问题