以下是该方案: 有两个服务器,A和B,它们位于不同的域中。 当用户访问服务器A的网页时,它使用服务器A的证书加密网站,并通过HTTPS将加密的网站返回给用户。 然后,用户输入了一些数据。
现在,我想通过HTTPS对服务器B(在其他域)进行ajax调用以提交数据。 在服务器B,我需要检查ajax调用是否真的来自服务器A. 因此,我想检查服务器A的证书(客户端证书)以验证呼叫。
我的问题是: JQuery的ajax可以通过https发送服务器A的证书,所以我可以在服务器B上查看它吗?
注: 由于某些原因,响应无法返回到服务器A.它必须直接转到服务器B.
任何帮助都会非常感激。谢谢!
答案 0 :(得分:1)
现在,我想通过HTTPS对服务器B(在其他域)进行ajax调用以提交数据。在服务器B,我需要检查ajax调用是否真的来自服务器A.因此,我想检查服务器A的证书(客户端证书)来验证呼叫。
你不能真的这样做,因为这不是它的工作原理。因为您的JavaScript在客户端的浏览器中而不是在服务器上运行,所以请求不是来自服务器A,而是直接来自客户端的计算机。
因此,您需要做的是验证请求来自有权访问服务器A上相关资源的人。
执行此操作的一种方法是将响应发送到服务器A,对其进行验证,然后将其发送到服务器B,但您已经说过不能这样做了。
另一种方法是在服务器A上生成一些令牌值,将其发送到客户端,让客户端将其发送到服务器B,在那里验证它。
例如,您可以拥有A和B已知的预共享密钥,使用该秘密在服务器A上生成当前时间的HMAC,然后在服务器B上验证HMAC并检查时间以确保其年龄是合理的。你可以通过多种不同的方式来实现这一目标。
最后,您还可以让服务器B仅发送服务器A地址的Access-Control-Allow-Origin
标头。这是我可以想到的唯一方法,无需修改服务器A即可完成此操作,它可以保护您免受其他网站热链接的影响,但不会阻止任何人直接从服务器B获取资源 Web浏览器的上下文。
答案 1 :(得分:0)
如果您想要从服务器A发送证书以及ajax发布/获取到服务器B进行验证,我不会打扰。作为客户端的Javascript容易被篡改,因此您绝对不希望将CRT或CSR加载到帖子数据中。
我建议做的是检查帖子来自的IP然后在服务器B上运行bash脚本,使用OpenSSL检查服务器证书:
http://fdmanana.wordpress.com/2008/07/01/getting-a-servers-certificate-with-openssl/
如果有人想将他们的IP欺骗到服务器A的IP,你将无从知晓。
编辑:您可能希望查看以下内容:https://developer.mozilla.org/en-US/docs/How_to_check_the_security_state_of_an_XMLHTTPRequest_over_SSL
但请记住,通过证书发送不会验证请求的来源,因为任何人都可以随时下载您的crt和链文件。