【发布时间】:2017-04-01 12:16:17
【问题描述】:
我有一个带有两个 https 服务器的站点。一个(前端)提供由静态页面组成的 UI。另一个(后端)提供微服务。他们俩碰巧都使用相同的(测试)X509 证书来标识自己。单独来说,我可以通过需要客户端证书“tester”的 https 连接到它们。
到目前为止,我们一直在通过 nginx 设置来隐藏 CORS 问题,该设置使前端和后端看起来是相同的 Origin。我已经为所有请求实现了标题“Access-Control-Allow-Origin”、“Access-Control-Allow-Credentials”;带有用于预检检查请求的方法、标头 (OPTIONS)。
在 Chrome 中,像这样的跨站点可以正常工作。我可以看到前端 URL 和后端 URL 是不同的站点。我看到在发出后端请求之前发出了 OPTIONS 请求。
-
尽管 Chrome 似乎不需要它,但我确实找到了将用于执行请求的 xmlhttprequest 对象并在其上执行了
xhr.withCredentials = true,因为这似乎是 fetch.js 在幕后所做的当它得到"credentials":"include"。我注意到有一个可用的xhr.setRequestHeader函数,我可能需要使用它来让 Firefox 开心。- Firefox 的 UI 调用行为相同。但是对于所有后端调用,我得到一个 405。当它这样做时,没有与服务器建立网络连接。浏览器只是决定这是一个 405 而不执行任何 https 请求。尽管这与 Chrome 的行为不同,但它是有道理的。前端 UI 和后端服务都需要选择客户端证书。当我连接到 UI 时,我选择了证书“tester”。当它发出后端请求时,它可以假设应该使用相同的客户端证书来到达后端。但也许它假设它可能会有所不同,我还需要告诉 Firefox。
这里有没有人使用 CORS 和这样的 2 路 SSL 证书,并且遇到了这个 Firefox 问题并在某个地方修复了它。我怀疑这不是服务器端修复,而是客户端需要做的事情。
【问题讨论】:
-
你在 Safari 中测试过吗?边缘?知道他们在这方面与 Firefox 匹配会很有趣。这可能是您看到的仅在 Chrome 中发生的行为。 Firefox 的行为似乎符合当前规范。
-
我遇到了同样的问题,我们也使用 2-way SSL 设置。除了我没有得到任何状态码——Firefox 只是中止了 ajax 调用。你有没有解决过这个问题?
-
基本上,这是一个错误,它甚至可以在 Chrome 中运行。规范说 OPTION 动词在发出请求时不应使用客户端证书。如果您拒绝没有客户端证书的所有连接,那么您将永远无法获得 OPTIONS 请求。您可以让 nginx 为您发回 200 并阻止您的服务看到 OPTION。这就是我要尝试的方法,因为如果 CORS 不可移植,它几乎毫无用处。 bugzilla.mozilla.org/show_bug.cgi?id=1019603#c9
-
规范要求的问题是浏览器在发送请求之前就知道它是什么类型的请求,但是服务器直到在 TLS协商之后才知道
-
我为此提出了bugs.chromium.org/p/chromium/issues/detail?id=775438(几年前)。 Chrome 的行为尚未更改,尽管该错误中的 cmets 表明他们确实打算更改它。