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

12

我希望能够做到类似myopenid所做的事情-一旦您登录,就可以单击按钮生成SSL证书;然后浏览器会下载此证书并存储它。当您以后再次访问yourid.myopenid.com时,您的浏览器可以使用其存储的证书进行身份验证,因此您永远不需要密码。

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

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

5个回答

8
这些通常被称为客户端证书。
我实际上没有使用过它,但可以在这里找到restful-authentication的修改版本(链接),看起来符合你的要求。
我是通过Dr. Nic的帖子发现的。

2
根据服务器不同而定,但我所知道的最简单的解决方案是使用Apache:FakeBasicAuth。启用此选项后,客户端X509证书的主题可分辨名称(DN)将转换为HTTP Basic授权用户名。这意味着可以使用标准的Apache身份验证方法进行访问控制。用户名只是客户端X509证书的主题(可以通过运行OpenSSL的openssl x509命令确定:openssl x509 -noout -subject -in certificate.crt)。请注意,不存在从用户获取密码的情况... 不确定rails,但通常REMOTE_USER环境变量应以某种方式可访问。

1

如果您想生成证书,您需要让客户端生成一个密钥对,并将至少公钥发送给您。您可以通过 Firefox 中的 Javascript 调用 crypto.generateCRMFRequest 来完成此操作。我猜测其他浏览器也有特定于浏览器的方法可用。但首先,您需要弄清楚如何在获取公钥后发放证书。

您可以使用 OpenSSL 在服务器上编写脚本,但它内置支持 CSR,而不是 Firefox 将发送给您的 CRMF 格式。因此,您需要编写一些代码将 CRMF 转换为 CSR,这将需要某种 DER 处理能力……我只是浅显地介绍了一下——即使是玩具应用程序的 CA 操作也不简单。

像 OpenId 和 PKI 解决方案这样的 SSO 解决方案与 PKI 有重叠之处。但魔鬼在细节中,这种方法存在已经很长时间,但只在政府和军事应用中才得以推广的充分理由。

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


你可以使用keygen元素,而不是http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#the-keygen-element - hendry

1

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

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

无论您使用哪种方法来生成它们,然后都需要配置您的Web服务器以要求客户端证书。请参见Apache文档以获取示例。


CSR生成(或等效)在大多数流行的浏览器中运行(IE,FF,Chrome等),但代码往往是特定于浏览器的。请参见此答案:https://dev59.com/q2ox5IYBdhLWcg3wcj94#9198400 - Bruno
很棒的答案,Bruno - 我认为这是比目前在这里任何答案都要好的答案 :-) - Rich

0

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

我创建了必要的服务器设置和一个Firefox插件来处理基于证书的身份验证。请访问mypassfree.com获取免费的Firefox插件。发送电子邮件给我(该页面上的链接)以获取服务器设置,因为我尚未将其与漂亮的安装程序打包在一起。

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

乔纳森


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接