代码之家  ›  专栏  ›  技术社区  ›  nnevala

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

  •  5
  • nnevala  · 技术社区  · 15 年前

    设置如下:

    • 火狐(3.x和4b)具有正确的设置和工作证书,包括客户端证书。
    • 具有xmlhttpRequest()类型的Ajax调用的网页 不同的子域 .
    • 所述子域中的自定义Web服务器接受请求,并使用许可 Access-Control-Allow-Origin 页眉和页眉 需要客户验证 .

    问题是火狐突然中止了请求(好吧,这就是它在Firebug中所说的)。使用运行安装程序 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中的一个bug。 但是,使用 <script> 注入到DOM中的元素似乎按预期工作…

    那么,还有人碰到过这个吗?是虫子吗?有什么解决办法吗?有明显的缺失吗?

    2 回复  |  直到 10 年前
        1
  •  4
  •   clint    10 年前

    5年后的插嘴可能对手术没有多大帮助,但如果将来有人有这个问题…

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

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

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

        2
  •  2
  •   linusthe3rd    15 年前

    与简单的XHR请求不同,注入脚本的原因是 Single Origin Policy . 这可能解释了为什么chrome允许xhr而不允许ff;chrome认为子域部分是同一个来源,但ff不允许。

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

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

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

    我也发现了 this article 它描述了你的处境。