提问人:James A. Rosen 提问时间:8/27/2008 更新时间:10/31/2012 访问量:14921
如何支持SSL客户端证书认证?
How do I support SSL Client Certificate authentication?
问:
我想做myopenid所做的事情 - 登录后,您可以单击生成SSL证书的按钮;然后,浏览器下载此证书并将其存储。当您稍后返回 yourid.myopenid.com 时,您的浏览器可以使用其存储的证书进行身份验证,因此您永远不需要密码。
所以我的问题是,要让它工作需要什么?如何生成证书?一旦它们呈现给我,我该如何验证它们?
我的堆栈是使用 Passenger 的 Apache 上的 Rails,但我不太讲究。
答:
这些证书通常称为客户端证书。
我实际上没有使用过它,但可以在这里找到 restful-authentication 的修改版本,它看起来像您的追求。
我是通过 Nic 博士的帖子找到的
取决于服务器,但我所知道的最简单的解决方案,使用 Apache:
“启用此选项后,客户端 X509 证书的使用者可分辨名称 (DN) 将转换为 HTTP 基本授权用户名。这意味着可以使用标准的 Apache 身份验证方法进行访问控制。用户名只是客户端 X509 证书的主题(可以通过运行 OpenSSL 的 openssl x509 命令:openssl x509 -noout -subject -in certificate.crt 来确定)。请注意,不会从用户那里获得密码..."
不确定 rails,但通常的 REMOTE_USER 环境变量应该可以以某种方式访问。
如果要生成证书,需要让客户端生成密钥对,并至少向您发送公钥。你可以在Firefox中通过Javascript调用来做到这一点,它是crypto.generateCRMFRequest。我猜其他浏览器中也有特定于浏览器的方法。但首先,您需要弄清楚获得公钥后如何颁发证书。
您可以使用OpenSSL在服务器上编写脚本,但它内置了对CSR的支持,而不是Firefox发送给您的CRMF格式。因此,您需要编写一些代码来将 CRMF 转换为 CSR,这需要某种 DER 处理能力......我只是在这里触及了表面——操作 CA,即使是玩具应用,也不是一件容易的事。
像 OpenId 和 PKI 解决方案这样的 SSO 解决方案确实重叠,并且 PKI 中有一种优雅。但魔鬼在细节中,这种方法已经存在了很长时间,但只在政府和军事应用中流行起来,这是有充分理由的。
如果您有兴趣追求这一点,请跟进一些特定于您想要开发 CA 服务的平台的问题。
评论
我一直在研究解决这个问题的方法。我想做同样的事情,我知道很多其他网站所有者都想要这个功能,无论有没有第三方提供商。
我创建了必要的服务器设置和一个 firefox 插件来处理基于证书的身份验证。转到 mypassfree.com 获取免费的 firefox 插件。给我发电子邮件(该页面上的链接)以获取服务器设置,因为我还没有将其与一个不错的安装程序打包在一起。
服务器设置是 Apache2 + OpenSSL + Perl(但你可以用任何语言重写 perl 脚本)
乔纳森
您可以使用特定于浏览器的代码在客户端的浏览器中生成证书。请参阅此问题
您还可以在 Ruby 中使用 OpenSSL 在服务器端生成 SSL 客户端证书(请参阅此 q)。(这将适用于任何没有浏览器特定代码的浏览器,但您的服务器将生成客户端的私钥,这对于加密纯粹主义者来说并不理想。
无论您使用哪种方法来生成它们,您都需要将 Web 服务器配置为需要客户端证书。有关示例,请参阅 Apache 文档。
评论