使用xhr,客户端证书的Firefox中的跨域SSL握手失败

时间:2010-11-24 13:40:01

标签: javascript ajax firefox https client-certificates

设置如下:

  • Firefox(包括3.x和4b),具有正确设置和工作的证书,包括客户端证书。
  • 带有XMLHttpRequest()类型的AJAX调用不同子域的网页。
  • 所述子域中的自定义网络服务器接受请求,使用允许的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的<script>元素执行ajax调用似乎按预期工作...

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

2 个答案:

答案 0 :(得分:4)

5年后的Chiming可能对OP没什么帮助,但是如果其他人在将来遇到这个问题......

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

有关详细信息,请参阅this Mozilla Dev Network blog post。特别是,以下声明:

  

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

答案 1 :(得分:2)

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

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

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

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

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