是否允許中間代理在代理身份驗證期間添加 cookie?
我最近遇到了某種安全設備(BlueCoat),它要求所有到網際網路的連接都必須通過它進行代理(你好,中間人),因此使用特殊的 SSL 證書來攔截所有流量。
這阻止了 Git 的正常執行,即使設置了適當的
http.proxy
和http.sslCAInfo
屬性以確保 SSL 連接本身工作。使用環境變數
GIT_CURL_VERBOSE=1
,我們發現使用的時候git clone
,會出現HTTP 407(需要代理認證)。Git 正確地完成了此身份驗證,並在此結束時,設備返回帶有 cookie 標頭的 HTTP 200Set-Cookie
。然後 Git 將連接到目標伺服器,但沒有cookie,導致 HTTP 401。
解決方案是設置 git 配置選項
http.saveCookies=true
問題: 中間代理添加 cookie 是否真的被 RFC 標准允許?
Anthony Rich向 http-state 郵件列表提出了同樣的問題,但沒有任何回應。他確實注意到在
RFC 2965 HTTP 狀態管理機制,3.5 記憶體代理角色它說:代理不得在代理響應(請求)中引入自己的 Set-Cookie2(Cookie)標頭。
但是,取代的 RFC 6265根本不再提及這一點。
HTTP cookie 是一團糟。沒有真正的標準;RFC,就其價值而言,只是試圖記錄實際的使用者代理正在做什麼。
在任何情況下,您可能想要閱讀的 RFC 是RFC 7235,它指定代理應該發送一個 Proxy-Authenticate 帶有 407 狀態的標頭來請求身份驗證資訊,並且接收此資訊的使用者代理應該使用一個重試請求Proxy-Authorization 標頭包含代理的身份驗證資訊。
可以使用許多質詢/響應方法來提供此資訊;最廣泛使用的是“基本”(RFC 7617),因為幾乎所有講 HTTP 的東西都實現了它。
IANA 維護著一個已知 HTTP 身份驗證方案的系統資料庫。作為一般規則,它們使用之前命名的 HTTP 標頭,或者它們被標記為不合規。沒有人使用 cookie 進行身份驗證。
代理是否允許添加或更改 cookie,我不能說。RFC 在這一點上似乎真的不是很清楚。這肯定是出乎意料的行為,尤其是對於身份驗證。而 BlueCoat 在質量上有著悠久的歷史……