如何支持SSL客户端证书认证?

How do I support SSL Client Certificate authentication?

提问人:James A. Rosen 提问时间:8/27/2008 更新时间:10/31/2012 访问量:14921

问:

我想做myopenid所做的事情 - 登录后,您可以单击生成SSL证书的按钮;然后,浏览器下载此证书并将其存储。当您稍后返回 yourid.myopenid.com 时,您的浏览器可以使用其存储的证书进行身份验证,因此您永远不需要密码。

所以我的问题是,要让它工作需要什么?如何生成证书?一旦它们呈现给我,我该如何验证它们?

我的堆栈是使用 Passenger 的 Apache 上的 Rails,但我不太讲究。

Ruby-on-Rails Apache SSL

评论


答:

8赞 russtbarnacle 8/27/2008 #1

这些证书通常称为客户端证书。

我实际上没有使用过它,但可以在这里找到 restful-authentication 的修改版本,它看起来像您的追求。

我是通过 Nic 博士的帖子找到的

2赞 Mark Renouf 8/27/2008 #2

取决于服务器,但我所知道的最简单的解决方案,使用 Apache:

FakeBasicAuth

“启用此选项后,客户端 X509 证书的使用者可分辨名称 (DN) 将转换为 HTTP 基本授权用户名。这意味着可以使用标准的 Apache 身份验证方法进行访问控制。用户名只是客户端 X509 证书的主题(可以通过运行 OpenSSL 的 openssl x509 命令:openssl x509 -noout -subject -in certificate.crt 来确定)。请注意,不会从用户那里获得密码..."

不确定 rails,但通常的 REMOTE_USER 环境变量应该可以以某种方式访问。

1赞 erickson 8/29/2008 #3

如果要生成证书,需要让客户端生成密钥对,并至少向您发送公钥。你可以在Firefox中通过Javascript调用来做到这一点,它是crypto.generateCRMFRequest。我猜其他浏览器中也有特定于浏览器的方法。但首先,您需要弄清楚获得公钥后如何颁发证书。

您可以使用OpenSSL在服务器上编写脚本,但它内置了对CSR的支持,而不是Firefox发送给您的CRMF格式。因此,您需要编写一些代码来将 CRMF 转换为 CSR,这需要某种 DER 处理能力......我只是在这里触及了表面——操作 CA,即使是玩具应用,也不是一件容易的事。

像 OpenId 和 PKI 解决方案这样的 SSO 解决方案确实重叠,并且 PKI 中有一种优雅。但魔鬼在细节中,这种方法已经存在了很长时间,但只在政府和军事应用中流行起来,这是有充分理由的。

如果您有兴趣追求这一点,请跟进一些特定于您想要开发 CA 服务的平台的问题。

评论

0赞 hendry 5/26/2009
你可以只使用keygen元素,whatwg.org/specs/web-apps/current-work/multipage/...
0赞 apricoti 1/10/2009 #4

我一直在研究解决这个问题的方法。我想做同样的事情,我知道很多其他网站所有者都想要这个功能,无论有没有第三方提供商。

我创建了必要的服务器设置和一个 firefox 插件来处理基于证书的身份验证。转到 mypassfree.com 获取免费的 firefox 插件。给我发电子邮件(该页面上的链接)以获取服务器设置,因为我还没有将其与一个不错的安装程序打包在一起。

服务器设置是 Apache2 + OpenSSL + Perl(但你可以用任何语言重写 perl 脚本)

乔纳森

1赞 Rich 10/29/2012 #5

您可以使用特定于浏览器的代码在客户端的浏览器中生成证书。请参阅此问题

您还可以在 Ruby 中使用 OpenSSL 在服务器端生成 SSL 客户端证书(请参阅此 q)。(这将适用于任何没有浏览器特定代码的浏览器,但您的服务器将生成客户端的私钥,这对于加密纯粹主义者来说并不理想。

无论您使用哪种方法来生成它们,您都需要将 Web 服务器配置为需要客户端证书。有关示例,请参阅 Apache 文档

评论

0赞 Bruno 10/29/2012
CSR 生成(或等效)适用于大多数流行的浏览器(IE、FF、Chrome 等),但代码往往是特定于浏览器的。请参阅此答案: stackoverflow.com/a/9198400/372643
0赞 Rich 10/31/2012
很好的答案,布鲁诺 - 我认为这是比目前这里的任何答案都更好的答案:-)