2016-11-17 158 views
4

我有一个拥有两台https服务器的站点。一个(前端)提供由静态页面组成的用户界面。另一个(后端)提供微服务。他们恰好使用相同的(测试)X509证书来识别他们自己。单独地,我可以通过https连接到它们,要求客户端证书“tester”。CORS与客户端https证书

我们通过一个nginx设置来隐藏CORS问题,使得前端和后端显示它们是相同的Origin。我已经为所有请求实现了头部'访问控制 - 允许 - 来源','访问控制 - 允许 - 证书';使用方法,用于预检检查请求(OPTIONS)的标题。

  • 在Chrome中,像这样的跨网站工作得很好。我可以看到前端网址和后端网址是不同的网站。我看到OPTIONS请求在进行后端请求之前进行。

  • 即使Chrome似乎并不需要它,但我确实找到了将用于执行请求的xmlhttprequest对象,并在其上执行了xhr.withCredentials = true,因为这似乎是fetch.js在罩下执行的操作当它得到"credentials":"include"。我注意到有一个xhr.setRequestHeader函数可用,我可能需要使用它来使Firefox更快乐。

    • Firefox对于UI调用的行为相同。但是对于所有的后端调用,我得到一个405.当它这样做时,没有到服务器的网络连接。浏览器只是决定这是一个405而不执行任何https请求。尽管这是与Chrome不同的行为,但这样做有道理。前端UI和后端服务都需要选择客户端证书。当我连接到用户界面时,我选择了“测试仪”证书。当它发出后端请求时,它可以假设应该使用相同的客户端证书来访问后端。但也许它假设它可能会有所不同,并且还有一些我需要告诉Firefox。

里面有人在这样的双向SSL证书组合使用CORS,并且有这个Firefox的问题,并固定在某个地方。我怀疑这不是服务器端修复,而是客户需要做的事情。

+0

你在Safari中测试过吗?边缘?知道它们与Firefox匹配会很有趣。这可能是你看到的行为只发生在Chrome中。 Firefox的行为似乎符合当前的规范。 – sideshowbarker

回答

1

我实际上没有使用客户端证书对此进行测试,但我似乎记得,如果Access-Control-Allow-Origin设置为*通配符而不是实际域,Firefox将不会发送凭据。请参阅MDN上的this page

此外,Firefox向服务器发送CORS请求时存在问题,该服务器期望客户端证书在TLS握手中呈现。基本上,Firefox在预检期间不会发送证书,从而造成鸡和鸡蛋问题。有关bugz​​illa,请参阅this bug

+0

来自Chrome提交者的评论https://bugzilla.mozilla.org/show_bug.cgi?id=1019603#c9表明这里的错误实际上是在Chrome中,Firefox的行为是当前规范要求的。所以知道Safari和Edge在这里做什么会很有趣。 – sideshowbarker

+0

确实。如果事实证明Firefox的解释是正确的,那么如何在后端实现客户端证书认证呢?也许通过使用匿名SSL进行初始连接,然后在预检后重新协商?我不确定这是否会起作用。 – AfroThundr

+0

这是问题的正确答案。浏览器行为差异的原因只是Chrome中的一个错误。 Firefox,Edge和Safari都符合规范要求 - 也就是说,它们在预检请求中不包含SSL/TLC客户端证书。在https://stackoverflow.com/questions/46783506/why-is-the-tls-client-certificate-not-being-included-in-preflight-request-on-mos/46783730#46783730上查看相关答案 – sideshowbarker