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