当这些服务器通过我们的测试时,我的客户的站点会按 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 程序一样安全/不安全吗?
当然,有更好的方法来做这一切......