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

问题描述:

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

场景:

  1. 用户打开https://examle.com/网页,服务器身份验证
  2. 用户请求的帐户创建
  3. 密钥对用户的浏览器生成并没有透露服务器/ CA
  4. PUBKEY被发送到服务器签署
  5. 服务器SIGNES密钥和证书生成
  6. 证书发送到客户端,并与私钥一起安装在浏览器中

下次客户端连接到服务器时,他的身份将根据客户端证书进行验证。

这将是很好,如果服务器可能会迫使/提示客户使用密码加密来保护他的私钥。

我见过使用Java applet进行此任务的网上银行。是否可以使用本地浏览器功能来完成它? Apache/PHP或Node.js解决方案将受到欢迎。

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

  • 对于Internet Explorer,你将不得不使用X509Enrollment.CX509EnrollmentWebClassFactoryCEnroll.CEnroll,取决于它是否对Windows XP或Vista/7上运行使用某些ActiveX控件。这将生成一个PKCS#10证书请求(您可能需要在传统分隔符之间打包)。
  • 其余的,您应该可以使用<keygen />标签。它是传统的Netscape标签,以前不是正式的HTML标签,但是它已经把它变成了HTML 5(尽管MS说他们不会支持它的实现),这将产生一个SPKAC结构(类似于CSR)。使用CRMF functions

Here is an example script应该做的最对ActiveX或注册机的工作。

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

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

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

如果你想要一个现成的解决方案,你可能会喜欢OpenCA

+0

我如何使用私钥解密数据(在HTML5/kegen-tag的情况下)? – MhdSyrwan 2013-11-12 23:51:35

+2

''元素根据[W3C](http://w3c.github.io/html/sec-forms.html#elementdef- keygen),[WHATWG](https://html.spec.whatwg)弃用.org/multipage/forms.html#the-keygen-element)和[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen),并在Chrome中被故意禁用从版本49开始。 – 2016-04-21 15:44:39