Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 对不受信任(自签名)HTTPS的AJAX调用以静默方式失败_Jquery_Ajax_Ssl_Ssl Certificate - Fatal编程技术网

Jquery 对不受信任(自签名)HTTPS的AJAX调用以静默方式失败

Jquery 对不受信任(自签名)HTTPS的AJAX调用以静默方式失败,jquery,ajax,ssl,ssl-certificate,Jquery,Ajax,Ssl,Ssl Certificate,我想对使用自签名证书的安全服务器进行AJAX调用。在使用我的应用程序的环境中,这很好——我可以向用户提供CA证书,并让他们在使用应用程序之前安装。但是,有时,用户会在安装证书之前尝试访问应用程序。在这些情况下,应用程序会无声地失败——至少在Firefox(最常见的问题)中,调用似乎会无声地终止,甚至不会触发错误处理程序。FWIW,如果用户访问服务器上的实际页面,他们会收到证书警告 我可以破解一个解决方案——比如,发出心跳/ping请求,设置一个看门狗定时器,看看服务器是否及时响应——但这看起来,

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

我可以破解一个解决方案——比如,发出心跳/ping请求,设置一个看门狗定时器,看看服务器是否及时响应——但这看起来,嗯,很难破解。我希望能够提前测试连接。什么是“正确”的方法来确保您想要与之交谈的服务器具有Javascript中的可信证书?如果有什么不同的话,我将通过JQuery执行AJAX请求

更新:这里有一个很棒的笑话。事实证明,AJAX根本不是问题所在。基于症状,我确信这与自签名证书有关,但缺乏AJAX错误令人不安,特别是考虑到下面答案中链接的规范。另一位团队成员指出了这一点:AJAX错误处理程序没有启动,因为JQuery从未加载过!我们在网站的另一个子域中加入了JQuery,该子域也托管在HTTPS上——用户为ourService.example.com添加了例外,但没有为js.example.com添加例外。显然,如果将
标记指向不受信任的安全连接,该连接也会无声地失败

{/headdesk}

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

我看到的一个不那么粗俗的解决方案是,您只需强制将所有用户重定向到SSL站点。这样,在发出任何AJAX请求之前,他们将被迫看到证书警告


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

您看到的行为是否与无法联系服务器(例如网络连接断开)有所不同?您在第一段中是正确的,而在第二段中不是正确的。任何浏览器都不能自由地允许从HTTP到HTTPS进行XMLHTTPRequest。一些浏览器(如Firefox)有一个opt-in-allow机制(如访问控制allow-Origin头)。IE没有这样的机制。