在浏览器中生成客户端证书并在服务器上签名
问题描述:
是否可以请求在浏览器中生成客户端密钥对,并将公钥发送给服务器CA进行透明签名?然后在用户的浏览器中安装签名证书?在浏览器中生成客户端证书并在服务器上签名
场景:
- 用户打开https://examle.com/网页,服务器身份验证
- 用户请求的帐户创建
- 密钥对用户的浏览器生成并没有透露服务器/ CA
- PUBKEY被发送到服务器签署
- 服务器SIGNES密钥和证书生成
- 证书发送到客户端,并与私钥一起安装在浏览器中
下次客户端连接到服务器时,他的身份将根据客户端证书进行验证。
这将是很好,如果服务器可能会迫使/提示客户使用密码加密来保护他的私钥。
我见过使用Java applet进行此任务的网上银行。是否可以使用本地浏览器功能来完成它? Apache/PHP或Node.js解决方案将受到欢迎。
答
是的,这是可能的。虽然没有跨浏览器的解决方案。
- 对于Internet Explorer,你将不得不使用
X509Enrollment.CX509EnrollmentWebClassFactory
或CEnroll.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。
我如何使用私钥解密数据(在HTML5/kegen-tag的情况下)? – MhdSyrwan 2013-11-12 23:51:35
''元素根据[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