我最近遇到了一个安全设备(BlueCoat),它需要全部必须通过它代理连接到互联网(你好,中间人),并因此使用特殊的 SSL 证书来拦截所有流量。
尽管设置了适当的属性以确保 SSL 连接本身能够正常工作,但这仍然阻碍了 Git 的正常http.proxy
运行http.sslCAInfo
。
使用环境变量GIT_CURL_VERBOSE=1
,我们发现在使用 时git clone
,会出现 HTTP 407(需要代理身份验证)。Git 正确完成了此身份验证,最后,设备返回带有 cookie 标头 的 HTTP 200 Set-Cookie
。
然后 Git 将连接到目标服务器,但是没有该 cookie,导致 HTTP 401。
解决方案是设置 git 配置选项http.saveCookies=true
问题: RFC 标准是否确实允许中间代理添加 cookie?
安东尼·里奇向 http-state 邮件列表询问了同样的问题但没有任何回应。他确实注意到
RFC 2965 HTTP 状态管理机制,3.5 缓存代理角色其中规定:代理不得在代理响应(请求)中引入自己的 Set-Cookie2(Cookie)标头。
但是,那取代 RFC 6265根本不再提及此事。
答案1
HTTP cookies 很乱。没有真正的标准;RFC 仅试图记录实际用户代理正在做什么。
无论如何,你可能想阅读的 RFC 是RFC 7235,它指定代理应该发送具有 407 状态的 Proxy-Authenticate 标头来请求身份验证信息,并且接收此信息的用户代理应该使用包含代理身份验证信息的 Proxy-Authorization 标头重试请求。
可以使用多种质询/响应方法来提供此信息;最广泛使用的是“基本”(RFC 7617),因为几乎所有使用 HTTP 的东西都实现了它。
IANA 维护已知 HTTP 身份验证方案的注册表。一般来说,它们使用前面提到的 HTTP 标头,否则它们会被标记为不合规。没有一个使用 cookie 进行身份验证。
我不能说是否允许代理添加或更改 cookie。RFC 似乎确实没有明确说明这一点。当然意外行为,尤其是身份验证。而 BlueCoat 长期以来质量平庸……