AJAX调用不受信任(自签名)的HTTPS无声地失败

Cod*_*rer 22 ajax ssl jquery ssl-certificate

我想对使用自签名证书的安全服务器进行AJAX调用.在我的应用程序使用的环境中,这很好 - 我可以向用户提供CA证书,并让他们在使用应用程序之前安装它.但是,有时,用户会在安装证书之前尝试访问该应用程序.在这些情况下,应用程序默默地失败 - 至少在Firefox(问题的最常见情况)中,看起来调用无声地死亡,甚至没有触发错误处理程序.FWIW,如果用户访问服务器上的实际页面,则会收到证书警告.

我可以破解一个解决方法 - 例如,发出一个心跳/ ping请求并设置一个看门狗定时器来查看服务器是否及时响应 - 但这看起来好吧,哈希.我希望能够提前测试连接.确保要与之交谈的服务器具有来自Javascript的可信证书的"正确"方法是什么?如果它有任何区别,我正在通过JQuery做我的AJAX请求.

更新:这里有一个很棒的妙语.事实证明,AJAX根本不是问题.我确信它基于与自签名证书相关的症状,但缺乏AJAX错误令人不安,尤其是.鉴于以下答案中链接的规范.另一个团队成员钉了它:AJAX错误处理程序没有启动,因为JQuery从未加载过!我们在我们网站的另一个子域中包含了JQuery,也是在HTTPS上托管的 - 用户为ourService.example.com添加了例外,但没有为js.example.com添加例外.显然,如果您将<script>标记指向不受信任的安全连接,那么它也会无声地失败.

{/ headdesk}

Sel*_*aek 16

XMLHttpRequests(AJAX请求)仅允许在同源服务器上使用.这意味着目标URL的方案:// host:port部分必须与当前文档的部分匹配.根据规范,您甚至不应该允许您对来自非SSL的SSL URL发出请求.

我看到的那种不那么强硬的解决方案就是强制将所有用户强制重定向到SSL站点.这样,在发出任何AJAX请求之前,他们将被迫查看证书警告.

注意:规范还说,如果TLS握手失败(我认为这种情况在某种程度上属于),它应该抛出一个NETWORK_ERR(代码19)异常.您可以尝试在启动AJAX请求时捕获异常.有关更多详细信息,请参阅错误处理规范.

  • 你在第一段是正确的而不是在第二段.没有浏览器可以自由地允许从HTTP到HTTPS进行XMLHTTPRequest.某些浏览器(例如Firefox)具有选择允许机制(例如,Access-Control-Allow-Origin标头).IE没有这样的机制. (2认同)