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