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

Kit*_*ten 16 ssl client-side ssl-certificate

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

场景:

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

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

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

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

Bru*_*uno 16

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

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

这是一个示例脚本,应该完成ActiveX或Keygen的大部分工作.

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

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

在服务器端,您可以使用各种工具实现自己的CA. OpenSSL和BouncyCastle可以处理PKCS#10和SPKAC.这是一个基于BouncyCastle的示例(与上面的脚本相关联),以及一些CRMF代码.

如果您想要一个现成的解决方案,您可能会对OpenCA这样的东西感兴趣.

  • 根据[W3C](http://w3c.github.io/html/sec-forms.html#elementdef-keygen),[WHATWG](https://html.spec)不推荐使用`<keygen>`元素. whatwg.org/multipage/forms.html#the-keygen-element)和[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen)并故意禁用Chrome版本49. (2认同)