【问题标题】:Generating client side certificates in browser and signing on server在浏览器中生成客户端证书并在服务器上签名
【发布时间】:2012-02-08 16:32:51
【问题描述】:

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

场景:

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

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

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

我看到网上银行使用 java 小程序来完成这项任务。是否可以使用本机浏览器功能来做到这一点?欢迎使用 Apache/PHP 或 Node.js 解决方案。

【问题讨论】:

    标签: ssl ssl-certificate client-side


    【解决方案1】:

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

    • 对于 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 之类的内容感兴趣。

    【讨论】:

    • 如何使用私钥解密数据(HTML5/kegen-tag的情况下)?
    • <keygen> 元素已根据 W3CWHATWGMDN 弃用,并且从版本 49 起有意在 Chrome 中禁用。
    • @Adam Mackler 除了<keygen>,还有其他跨浏览器替代品吗?
    • @Filip Š 我没有找到。我最终自己编写了它的javascript。但那是不久前的事了,从那以后我就再也没有调查过。
    • <keygen> 已弃用,请参阅alternatives
    猜你喜欢
    • 2010-11-13
    • 2011-06-11
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多