2010-11-24 86 views
5

的設置如下:跨域SSL握手失敗使用XHR,客戶端證書

  • 火狐(二者3.x和4b)上正確地設置和工作證書,包括客戶端證書。
  • 帶有XMLHttpRequest()類型的AJAX調用的網頁調用不同的子域
  • 所述子域中的自定義web服務器接受請求,響應頭文件Access-Control-Allow-Origin要求客戶端驗證

問題在於Firefox突然中止請求(好吧,這就是它在螢火蟲中說的)。運行與openssl s_server的設置,而不是暗示,火狐居然甚至不發送客戶端證書:

140727260153512:error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer 
did not return a certificate:s3_srvr.c:2965:ACCEPT 

完全相同的設置與Chrome瀏覽器的完美,這也許是在Firefox中的錯誤。 但是,執行注入DOM中的<script>元素的ajax調用似乎按預期工作...

那麼,有沒有其他人遇到過這種情況?這是一個錯誤嗎?任何解決方法?有沒有明顯的缺失?

+0

解決方法是使用opensource Forge項目:https:// github。com/digitalbazaar/forge/blob/master/README – dlongley 2010-11-30 21:26:24

+0

歡呼聲輸入。 Forge看起來很漂亮,但由於它需要Flash,所以在這裏不適用。 – nnevala 2010-12-01 12:12:07

回答

3

敕命在5年以後可能不是到OP太大的幫助,但如果其他人在未來有這個問題...

火狐似乎發送客戶端證書與一個默認的跨源XHR請求。在XHR實例上設置withCredentials=true解決了我的問題。請注意,我也沒有看到Chrome的問題 - 只有Firefox。

欲瞭解更多信息,請登錄this Mozilla Dev Network blog post。具體來說,以下聲明:

默認情況下,在跨站點XMLHttpRequest調用中,瀏覽器將不會發送憑證 。調用時,必須在XMLHttpRequest對象上設置特定的標誌。

2

注入腳本的原因與簡單的XHR請求相反,原因是Single Origin Policy。這可能會解釋爲什麼Chrome允許XHR而不是FF; Chrome會考慮同一來源的子域部分,但FF不會。

允許注入來自其他域的腳本(這就是谷歌分析所做的),並且是處理這種情況的一種做法。

我的團隊處理這種情況的方式是通過服務器端代理髮出請求。

如果可以,我會推薦使用服務器端代理,但只要代碼來自可信來源,腳本注入方法就可以正常工作。

我還發現this article它描述你的情況。