我们的 Web 应用程序有很多 ajax 调用,而且都是 https 请求(我们的 IT 团队要求),是的,我们已经打开 header 以允许跨域。但问题是我们有自己的自定义证书,内部用于我们所有的应用程序,所以基本上我在调用 ajax 时出错:
Failed to load resource: net::ERR_INSECURE_RESPONSE
如果我在浏览器中打开 URL 并接受证书,ajax 调用就可以正常工作。所以我的问题是,有没有办法通过 Javascript 来处理这个问题?或者添加受信任的证书会解决这个问题吗?此外,即使在我们添加受信任的证书后,我还会再次面临 ajax 中的任何问题吗?
注意:我们正在 chrome 浏览器中测试所有这些
最佳答案
是的,将证书添加到用户的受信任证书列表中可以解决您的问题。只要您的服务器正确设置为服务器 CORS(看起来是这样,基于您接受证书后的成功),证书是您唯一的问题。
HTTPS 提供两个安全优势:
- 您知道您和任何与您交谈的人之间的通信 channel 是安全的(例如,当 Alice 与 Bob 交谈时,她知道没有其他人可以窃听)
- 您知道您正在与谁交谈是他们声称的真实身份(例如,当 Alice 与
bob.com
交谈时,她知道这确实是她所知道的服务器作为bob.com
而不是冒名顶替者)
第一个好处是自动的。它由加密协议(protocol)保证,不能被剥离(除非对安全漏洞进行非常复杂的攻击,通常可以很快修复)。
第二个好处并不是严格意义上的技术好处:它是一个信任的问题。服务器使用证书将他们的公钥(授予第一个安全组件)与他们自己的身份联系起来。这些公钥证书由用户信任的机构签署,称为证书颁发机构 (CA)。
当您尝试连接到 bob.com
时,该站点会为您提供一个公钥以执行安全通信。你怀疑地说,“当然,这个公钥可以让我安全地与你交谈,但我怎么知道你是真的 bob.com
?”然后服务器会为您提供一个 CA 签名的证书,上面写着:
We, the VeriSign certificate authority, who are widely trusted to be thorough in our investigations, hereby attest that the following public key really does truly belong to
bob.com
:Public key:
ZGdlZGhydGhyaHJ0eWp5cmo...
Verifiably signed,
VeriSign
有许多主要的证书颁发机构(操作系统和浏览器)广泛信任它们颁发签名证书,当且仅当它们可靠地验证公钥确实属于某个域名时。因为您的操作系统已经信任这些签名,所以我们可以在没有任何确认的情况下使用它们。
当您使用自签名证书时,没有可信的 CA 验证您的证书确实属于您的域名。任何人都可以出示这样的文件:
Hey, man, this is 100% definitely the public key for
bob.com
:Public key:
WGdoZmpodHlqa2p1aXl1eWk...
Just trust us, the guys who wrote this note, okay? We're DEFINITELY sure that's the key. The guys who wrote this note are the guys who run
bob.com
. We promise.Signed,
The guys who wrote this note
这上面没有受信任的签名。用户必须决定他们是否愿意接受证书证明公钥确实属于 bob.com
。
做出有意义的决定是一个困难的过程——您需要检查证书并在某处找到公钥的预先存在的可信记录(或联系站点管理员或服务台代表)。实际上,您需要让您对证书的信任来自某处,因为它不是来自主要证书颁发机构的可信签名。
允许 JavaScript 自动做出这种信任决定是没有意义的。重点是用户必须决定证书是否可信,然后对系统的证书存储进行适当的修改。
这可以假设是针对 Ajax 请求完成的,但它不会很漂亮。您需要向用户显示一个浏览器 UI 屏幕,询问用户是否要信任脚本尝试访问的任何域的自签名证书。除了非常破坏浏览体验之外,这可能会造成危险的困惑:如果我在 example.com
上,突然(由于我不知道的脚本的操作)我我被要求信任 bob.com
的证书,我可能会纯粹基于我对 example.com
的信任而接受它。
将证书添加到您系统的受信任证书列表中,或者让它由您的系统已经信任的 CA 签名。
关于javascript - Javascript 中的 ERR_INSECURE_RESPONSE 处理提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28857340/