2013-03-05 57 views
0

当这些服务器通过我们的测试时,我的客户站点会按照IP为其客户提供证书。此认证仅适用于经过测试的IP。所以我们需要成为服务证书的人员,以便我们验证显示我们证书的网站确实是由我们测试的。因此,当客户的用户点击证书链接时,他们可以相信该网站确实经过了我们的测试(该网站没有被另一台未经我们测试过的服务器提供服务,但声称是) 。

siteB.com/certificate.php?companyid=1234 &服务器ID = 4321个

过程简化:

用户通过看起来像这样的链接指向我们的网站

  • 用户现场A
  • 用户单击指向我的站点(站点B)的链接查看站点A的证书。
  • 我的站点,站点B需要验证它确实是正试图显示由网站A.赚

最初证书站点A,我认为$ _ SERVER变种可能有一个值来表明谁引用的服务器是,但我收到的答复,发布有关该问题表明,虽然该信息存储在$ _SERVER [“HTTP_REFERER”],它是不可靠的(插件或用户可能会修改此值)。

由于我不能依赖于此,我需要另一种方法来验证引用的服务器是谁,他们声称是。我考虑使用一次性使用令牌,但是然后有效的服务器可以将令牌简单地传递给客户拥有的其他服务器(尚未经过测试),并且客户可以通过这种方式将任意数量的服务器声明为被认证由我们仅以一次测试的价格(以及破坏证书的完整性)为准。

我想知道如果这个问题是不可能做出一个万无一失的解决方案,并且最好的可以做的是混淆不受控制的端点(客户的服务器)意味着张贴关键指示他们是(例如,一个鬼鬼祟祟的客户必须阅读一些混乱的JavaScript,或者为了欺骗系统而拆卸闭源客户端程序)。

我的想法到目前为止是这样的(和它的可怕):


我需要做一个封闭源代码的程序运行客户端,可能通过Native Client这将在点击启动证书链接在客户网站(网站A)上首先通过我的网站(网站B)验证自己,然后打开与网站A的服务器,网站B的服务器和用户在网站B中的三方通信线路将验证网站A是他们自称是谁,然后向用户返回证书或错误消息,说明证书无法加载的原因(例如连接超时)。

网站B上的脚本与用户NaCl程序的公开流将use curl获取站点A的服务器的IP地址并进行验证。


对我来说,这是一个非常粗的解决方案(如果它甚至是一个解决方案),虽然大多数用户不会在意看别人的证书,让谁做护理去赴汤蹈火的用户(安装并运行NaCl计划)只是看看证书就是疯狂。

这感觉就像一个有点愚蠢的问题,但会运行此闪存,而不是只是作为安全/不安全运行一个程序的NaCl?

当然,有一种更好的方式去做的这一切......

回答

2

您最好的选择是要么信任REFERER或使用Origin标(你需要安装一个AJAX脚本可以投进网站使用ORIGIN)。您的服务器接收

什么都可以很容易地通过客户计算机是伪造的,而不是由服务器他们正在访问(未经客户的同意)。由于您的服务似乎是为客户服务的,他们没有理由伪造证书。你会有某些插件和代理的潜在问题,但你的警告信息可以解释这一点。

没有这样的东西闭源的客户端代码。任何人都可以简单地反编译或模拟运行时,所以你不会得到额外的安全性。

公钥/私钥也将无法正常工作(你的网站产生的事情来编码,有问题的服务器必须使用自己的私钥对它进行编码,客户端使用公钥来检查它)。他们仍然容易受到相同的问题:一个虚假网站可以将请求连同完美复制的标题一起转发到真实网站进行处理。

请注意以下事项:

  • AJAX允许报头由客户和/或服务器进行修饰,除非其由现代浏览器保证(但是可以由被改变ORIGIN头客户有一些工作)
  • 任何标准的URL请求具有浏览器产生的所有头,所以他们可以信任的(只能由客户
  • 改变
  • 发送到客户端计算机的任何代码或秘密(即使编译,混淆或其他)应视为公共。
  • 这是不是从浏览器的任何请求,可以在各方面被伪造,除IP地址(甚至可以代理)
+0

太棒了!我不知道ORIGIN标题。在查询字符串中使用ajax验证并重定向到带有一次性使用标记(在验证响应中提供)的证书页面的URL听起来很完美。就像你说的那样,客户没有理由想改变这个头值。谢谢,戴夫! – 2013-03-05 02:12:34

+0

酷!如果你需要任何帮助编程,请告诉我。我很乐意这样做!哈哈 – 2013-03-05 03:05:00

1

我的想法..如果可能的话,拿到证书发行服务器来创建基于该参考服务器的名称和一个hash一个cookie salt根据另一套这是在一个动态的,但可预见的方式产生的标准,如使用一周的用户的IP地址以及白天和小时当前分钟(太短期间对标准的数量可能抛出会导致一些假阳性认证失败,所以要小心)。然后,当用户到达您的站点时,阅读cookie的散列并将其与$_SERVER[“HTTP_REFERER”]生成的散列和预先建立的条件进行比较。这一点的不利之处在于,如果他们想成为dicks,引用服务器可以发布安全算法。

另一个可能更安全的选项是创建一个JavaScript应用程序,您可以将这个应用程序发送给服务器,将服务器发送到AJAX调用,然后您的服务器会根据我上面提到的相同类型的标准返回哈希。然后根据你的AJAX返回的哈希来引用服务器设置cookie,当它们到达你的站点时,它的检查方式与我前面提到的相同。但由于所有的处理都发生在你的服务器上,所以它是完全安全的。听起来像一个很酷的项目,祝你好运。

+1

这是行不通的。假设用户访问一个虚假网站,虚假网站的服务器直接向良好网站的服务器(CURL或其他)发送请求,提取cookie信息并将其转发给客户端以及他们的恶意内容。假冒的网站现在有一个“好”的cookie,并且你使用的任何加密/散列都是没有意义的。 – Dave 2013-03-05 01:44:46

+1

此外,AJAX的想法(并记住唯一安全的AJAX标题是ORIGIN)不比在标准URL中使用REFERER标题更安全。然而,它可能对代理和其他可能试图隐藏引用者的东西更健壮(使其在更多情况下工作,不*使其更安全或更不安全)。 – Dave 2013-03-05 01:47:50