我想做myopenid所做的事情 - 一旦你登录,你可以点击一个生成SSL证书的按钮;浏览器然后下载此证书并存储它。当您稍后返回yourid.myopenid.com时,您的浏览器可以使用其存储的证书进行身份验证,因此您不需要密码。
所以我的问题是让这个工作需要什么?我如何生成证书?一旦它们被呈现给我,我该如何验证它们?
我的堆栈是使用Passenger的Apache上的Rails,但我不太特别。
答案 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脚本)
乔纳森