我的网站有两个https服务器。一个(前端)提供由静态页面构成的UI界面。另一个(后端)提供微服务。它们都恰好使用相同的(测试)X509证书来进行身份验证。分别,我可以通过https连接到它们两个,并需要客户端证书“tester”。
我们一直通过nginx设置来隐藏CORS问题,使前端和后端看起来像是同一个来源。我已经为所有请求实现了“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调用的行为与Chrome相同。但对于所有后端调用,我得到了一个405错误。当它这样做时,没有任何网络连接被建立到服务器。浏览器只是决定这是一个405,而没有执行任何https请求。尽管这与Chrome的行为不同,但它有点合理。前端UI和后端服务都需要选择客户端证书。当我连接到UI时,我选择了证书“tester”。当它去进行后端请求时,它可能会假设相同的客户端证书应该用于到达后端。但也许它认为它可能不同,还有其他一些事情我需要告诉Firefox。
有没有人在使用CORS和双向SSL证书的组合时遇到过这个Firefox问题,并在某个地方解决了它。我怀疑这不是服务器端的修复,而是客户端需要做的事情。
编辑:请参见此处的答案:https://dev59.com/lGAf5IYBdhLWcg3wlDUD#74744206