2016-11-17 156 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