0

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

用户通过如下所示的链接被定向到我们的网站:

siteB.com/certificate.php?companyid=1234&serverid=4321

流程简化:

  • 用户在站点 A
  • 用户单击指向我的站点(站点 B)的链接以查看站点 A 的证书。
  • 我的站点,站点 B 需要验证它确实是站点 A,它正在尝试显示站点 A 获得的证书。

最初,我认为 $_SERVER 变量可能有一个值来指示引用服务器是谁,但我收到的发布问题的答案表明,虽然该信息存储在 $_SERVER["HTTP_REFERER"] 中,但它不是'不可靠(插件或用户可能会修改此值)。

由于我不能依赖它,我需要另一种方法来验证引用服务器是他们声称的那个人。我考虑使用一次性使用令牌,但随后有效的服务器可以简单地将令牌循环到客户拥有的其他服务器(尚未经过测试),并且客户可以通过这种方式声称他们的任意数量的服务器都经过认证我们只需支付一次测试的费用(以及损坏证书的完整性)。

我想知道这个问题是否不可能制定一个万无一失的解决方案,并且可以做的最好的事情是混淆不受控制的端点(客户的服务器)发布密钥以表明它们是证书的方式是为了(例如,一个鬼鬼祟祟的客户必须阅读一些混乱的 javascript,或者反汇编一个封闭源代码的客户端程序以欺骗系统)。

到目前为止,我的想法是这样的(这很糟糕):


我需要制作一个闭源程序来运行客户端,可能是通过本地客户端,该客户端将在单击客户网站(站点 A)上的证书链接时启动,这将首先在我的站点(站点 B ),然后打开与站点 A 的服务器、站点 B 的服务器和用户的 3 路通信线路,其中站点 B 将验证站点 A 是他们所说的那个人,然后将证书或证书返回给用户一条错误消息说明为什么无法加载证书(例如连接超时)。

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


对我来说,这是一个非常粗糙的解决方案(如果它甚至是一个解决方案),虽然大多数用户不会关心查看某人的证书,但让关心的用户经历了一些麻烦(安装和运行 NaCl 程序)只是看证书简直是疯了。

这感觉有点像一个愚蠢的问题,但是将其作为闪存运行会与运行 NaCl 程序一样安全/不安全吗?

当然,有更好的方法来做这一切......

4

2 回答 2

2

您最好的选择是信任 REFERER 或使用 ORIGIN 标头(您需要设置一个 AJAX 脚本,该脚本可以放入站点以使用 ORIGIN)。

您的服务器接收到的任何内容都可以很容易地被客户端计算机欺骗,但不会被他们正在访问的服务器(未经客户端同意)欺骗。由于您的服务似乎是为客户服务的,因此他们没有理由伪造凭据。您可能会遇到某些插件和代理的潜在问题,但您的警告消息可以解释这一点。

没有闭源客户端代码之类的东西。任何人都可以简单地反编译它或模拟运行时,因此您不会获得额外的安全性。

公钥/私钥也不起作用(您的站点生成要编码的东西,有问题的服务器必须使用其私钥对其进行编码,客户端使用公钥对其进行检查)。它们仍然容易受到相同问题的影响:虚假站点可以将请求连同完美复制的标头一起转发到真实站点进行处理。

要记住的事情:

  • AJAX 允许客户端和/或服务器修改标头,但现代浏览器保证的 ORIGIN 标头除外(但可以通过一些工作由客户端更改)
  • 任何标准的 URL 请求都有浏览器生成的所有标头,因此可以信任它们(只能由客户端更改)
  • 发送到客户端计算机的任何代码或秘密(即使已编译、混淆或其他)都应视为公开的。
  • 任何不是来自浏览器的请求都可以在各个方面被伪造,除了 IP 地址(甚至可以被代理)
于 2013-03-05T01:41:31.907 回答
1

我的想法.. 如果可能,让证书颁发服务器创建一个 cookie,该 cookiehash基于该引用服务器的名称和salt基于以动态但可预测的方式生成的另一组标准,例如使用用户的 IP 地址加上星期几,可能会输入小时数或当前分钟数(标准上的时间太短会导致一些误报身份验证失败,所以要小心)。然后,当用户到达您的站点时,读取 cookie 的哈希值并将其与根据$_SERVER[“HTTP_REFERER”]和预先建立的标准生成的哈希值进行比较。这样做的缺点是,如果引用服务器想成为鸡巴,他们可以发布安全算法。

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

于 2013-03-05T00:36:08.340 回答