5

设置如下:

  • 具有正确设置和工作证书的 Firefox(3.x 和 4b),包括客户端证书。
  • 带有 XMLHttpRequest() 类型的 AJAX 调用不同子域的网页。
  • 所述子域中的自定义 Web 服务器接受请求,以允许的Access-Control-Allow-Origin标头响应并要求客户端验证

问题是 Firefox 突然中止了请求(好吧,无论如何,这就是它在 firebug 中所说的)。相反,运行设置openssl s_server会提示 Firefox 实际上甚至不发送客户端证书:

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

相同的设置与 Chrome 完美配合,这表明 Firefox 中可能存在错误。但是,使用注入 DOM的元素执行 ajax 调用似乎可以按预期工作......<script>

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

4

2 回答 2

5

5年后的提示可能对OP没有太大帮助,但万一其他人将来遇到这个问题......

默认情况下, Firefox 似乎不会通过跨域 XHR 请求发送客户端证书。XHR 实例上的设置withCredentials=true为我解决了这个问题。请注意,我也没有在 Chrome 中看到这个问题——只有 Firefox。

有关详细信息,请参阅此 Mozilla 开发网络博客文章。特别是以下声明:

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

于 2015-12-04T15:59:56.233 回答
3

与简单的 XHR 请求相比,注入脚本的原因是Single Origin Policy。这可能可以解释为什么 Chrome 允许 XHR 但不允许 FF;Chrome 认为子域部分是同源的,但 FF 没有。

允许从其他域注入脚本(这是 Google Analytics 所做的),这是处理这种情况的一种做法。

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

如果可以的话,我建议使用服务器端代理,但只要代码来自受信任的来源,脚本注入方法就可以正常工作。

我还发现这篇文章描述了你的情况。

于 2010-11-24T13:52:47.673 回答