【问题标题】:Relaying an HTTPS request with proxy on C#在 C# 上使用代理中继 HTTPS 请求
【发布时间】:2014-05-17 20:22:15
【问题描述】:
我已经在请求标头上构建了一个带有一些逻辑的代理。
我使用套接字。
甚至在任何连接发生之前,在我的代理中我解析标头,添加身份验证
并将请求转发到目标主机。
现在我偶然发现了以下问题:
- 我必须中继 https 请求
- 我不需要任何正文操作,我只需要以相同的方式修改标头,将 CONNECT 转发到目标,接收答案并返回源套接字。
问题:
代理端是否需要 CA?
是否需要使用 SSlStream 来转发和接收请求?
如果是这样,算法可能是什么?
【问题讨论】:
标签:
c#
sockets
ssl
proxy
sslstream
【解决方案1】:
SSL 握手发生在 CONNECT 请求及其响应之后。如果您只需要操作 CONNECT 请求,您可以简单地在对等方之间握手后转发数据,例如没有 SSL 拦截,这意味着没有 SSLStream 和 CA。但是,如果您需要在 HTTPS 连接(GET、POST...)中操作请求的 HTTP 标头,则必须进行 SSL 拦截(例如,使用您自己的代理 CA 和 SSLStream 进行中间人)。
【讨论】:
-
-
cookies 不会在 CONNECT 请求中发送,仅用于为 SSL 建立隧道。 cookie 在受 SSL 保护的 HTTP 请求中发送(使用 https 的原因之一是保护这些 cookie),因此您需要进行 SSL 检查。这意味着:使用所有客户端都必须信任的您自己的代理 CA,将 SSL 流分离到客户端和服务器,确保您正确处理所有信任问题(不容易,请参阅 youtube.com/watch?v=7TNdHzwTNdM)并且客户端证书将不行。对于 C 代码,请查看 squid 代理中的 SSL 碰撞。