2010-11-24 162 views
5

的设置如下:跨域SSL握手失败使用XHR,客户端证书

  • 火狐(二者3.x和4b)上正确地设置和工作证书,包括客户端证书。
  • 带有XMLHttpRequest()类型的AJAX调用的网页调用不同的子域
  • 所述子域中的自定义web服务器接受请求,响应头文件Access-Control-Allow-Origin要求客户端验证

问题在于Firefox突然中止请求(好吧,这就是它在萤火虫中说的)。运行与openssl s_server的设置,而不是暗示,火狐居然甚至不发送客户端证书:

140727260153512:error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer 
did not return a certificate:s3_srvr.c:2965:ACCEPT 

完全相同的设置与Chrome浏览器的完美,这也许是在Firefox中的错误。 但是,执行注入DOM中的<script>元素的ajax调用似乎按预期工作...

那么,有没有其他人遇到过这种情况?这是一个错误吗?任何解决方法?有没有明显的缺失?

+0

解决方法是使用opensource Forge项目:https:// github。com/digitalbazaar/forge/blob/master/README – dlongley 2010-11-30 21:26:24

+0

欢呼声输入。 Forge看起来很漂亮,但由于它需要Flash,所以在这里不适用。 – nnevala 2010-12-01 12:12:07

回答

3

敕命在5年以后可能不是到OP太大的帮助,但如果其他人在未来有这个问题...

火狐似乎发送客户端证书与一个默认的跨源XHR请求。在XHR实例上设置withCredentials=true解决了我的问题。请注意,我也没有看到Chrome的问题 - 只有Firefox。

欲了解更多信息,请登录this Mozilla Dev Network blog post。具体来说,以下声明:

默认情况下,在跨站点XMLHttpRequest调用中,浏览器将不会发送凭证 。调用时,必须在XMLHttpRequest对象上设置特定的标志。

2

注入脚本的原因与简单的XHR请求相反,原因是Single Origin Policy。这可能会解释为什么Chrome允许XHR而不是FF; Chrome会考虑同一来源的子域部分,但FF不会。

允许注入来自其他域的脚本(这就是谷歌分析所做的),并且是处理这种情况的一种做法。

我的团队处理这种情况的方式是通过服务器端代理发出请求。

如果可以,我会推荐使用服务器端代理,但只要代码来自可信来源,脚本注入方法就可以正常工作。

我还发现this article它描述你的情况。