jquery - 对不受信任(自签名)HTTPS 的 AJAX 调用静默失败

标签 jquery ajax ssl ssl-certificate

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

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

更新:这里有一句很棒的妙语。事实证明,AJAX 根本不是问题所在。根据症状,我确信它与自签名证书有关,但缺少 AJAX 错误令人不安,尤其是。给出下面答案中链接的规范。另一名团队成员指出:AJAX 错误处理程序没有启动,因为从未加载 JQuery!我们从我们网站的另一个子域中包含 JQuery,该子域也托管在 HTTPS 上——并且用户为 ourService.example.com 添加了异常(exception),但没有为 js.example.com 添加异常(exception)。显然,如果您指向 <script>在不受信任的安全连接上标记,也会默默地失败。

{/headdesk}

最佳答案

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

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

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

关于jquery - 对不受信任(自签名)HTTPS 的 AJAX 调用静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4565772/

相关文章:

ubuntu - 如何在 ubuntu 上保护自签名证书?

javascript - 在隐藏表单输入中附加文件名

ajax - 如何在通过 Ajax 加载页面时删除页面标题集?

java - 警告 : Establishing SSL connection without server's identity verification is not recommended

javascript - 更好地理解 Promise.prototype.then

java - JavaScript 和 Servlet 之间的通信

iphone - iOS - 管理 SSL 连接上的可信根

javascript - 如何从 jQuery 选择器返回的列表中删除元素?

javascript - 手动触发 jQuery 验证?

javascript - 模式弹出后 Bootstrap 3 禁用背景