如何支持SSL客户端证书身份验证?

时间:2008-08-26 16:57:52

标签: ruby-on-rails apache ssl

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

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

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

5 个答案:

答案 0 :(得分:8)

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

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

我是通过Dr. Nic's post

找到的

答案 1 :(得分:2)

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

<强> FakeBasicAuth

  

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

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

答案 2 :(得分:1)

如果要生成证书,则需要使客户端生成密钥对,并至少向您发送公钥。您可以通过Javascript调用在Firefox中执行此操作,它是crypto.generateCRMFRequest。我猜测其他浏览器也有特定于浏览器的方法。但首先,一旦获得公钥,您需要弄清楚如何颁发证书。

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

OpenId和PKI解决方案等SSO解决方案确实重叠,PKI也很优雅。但是魔鬼在细节中,并且有很好的理由说明为什么这种方法已经存在了很长时间,但只是在政府和军事应用中起步。

如果您有兴趣继续这样做,请跟进一些特定于您希望开发CA服务的平台的问题。

答案 3 :(得分:1)

您可以使用特定于浏览器的代码在客户端的浏览器中生成证书。见this question

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

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

答案 4 :(得分:0)

我一直致力于解决这个问题。我想做同样的事情,我知道很多其他网站所有者想要这个功能,有或没有第三方提供商。

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

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

乔纳森