OpenSSL:HTTPS代理

时间:2016-03-18 15:42:30

标签: c++ ssl proxy openssl

到目前为止,我的代理只处理端口80上的HTTP连接:我想改进它并使其管理HTTPS请求。以下是它的工作原理:

代理正在侦听给定端口; Chrome可以"看"代理感谢SwitchyOmega插件并连接该给定端口上的流量。 代理读取数据包的标头,获取请求(我现在只解析GET个请求),例如, GET http://www.google.it HTTP/1.1,获取主机名解析www.google.it,通过使用gethostbyname解析主机名来查找IP地址,并假设服务器端口为数字80。

现在,代理通过打开套接字向服务器发送从客户端收到的内容:打开,绑定此套接字,然后连接到我之前通过主机名解析的IP地址。

我读了here如何将套接字转换为SSL套接字:在socketbindlistenaccept系统调用之后,设置所需内容并将套接字的文件描述符传递给SSL_set_fd,这样我就可以通过新的SSL文件描述符读写数据。

最让我烦恼的是创建SSL上下文:如果SSLv23_server_method用于服务器而SSLv23_client_method用于客户端,我应该将什么用于我的代理?

我在OpenSSL documentation中找不到特定的代理配置。

提前感谢您的帮助。

修改:有关代理如何运作的更详细信息。

1 个答案:

答案 0 :(得分:1)

SSL / TLS没有代理概念,只有点对点连接。您的代理具有到客户端的连接,以及与目标服务器的单独连接,它只是根据需要在两个连接之间传递数据。因此,代理必须彼此独立地保护(或不保护)这些连接,以及它必须如何做到这一点取决于客户端如何要求代理中继HTTP。

如果客户端向您的代理发送GET / POST / etc请求请求绝对HTTP URL,您的代理需要连接到目标服务器而不使用SSL / TLS,然后中继客户端的HTTP请求和服务器的来回响应。客户端可能使用SSL / TLS连接也可能不连接到您的代理。如果是,则该会话仅在客户端和您的代理之间进行,并且相应地对从客户端读取和发送的数据进行加密/解密。

如果客户端向您的代理发送请求绝对HTTPS URL的GET / POST / etc请求,则您的代理需要连接到目标服务器并与其建立自己的SSL / TLS会话服务器,然后来回中继客户端的HTTP请求和服务器的响应。代理充当服务器的客户端,因此使用基于客户端的方法(sslv23_client_method()等)。真实客户端可能使用SSL / TLS连接也可能不连接到您的代理。如果是,则该会话仅在客户端和您的代理之间进行,并且相应地加密/解密从客户端读取和发送的数据,与服务器连接上使用的加密分开。

如果客户端向您的代理发送CONNECT请求,则代理需要连接到请求的主机/端口,然后按原样来回传递原始数据。代理服务器不涉及SSL / TLS。如果代理处理客户端或服务器的SSL / TLS数据,它将充当MITM攻击者,SSL / TLS旨在防止这种情况。如果与服务器的连接成功,则客户端和服务器(不是代理)将使用SSL / TLS保护其各自的端点,以便它们直接相互通信(交换证书和密钥以及验证身份所需)。 SSL / TLS握手以及后续加密的HTTP请求/响应数据将按原样通过代理。代理只能看到原始加密数据,而不是HTTP数据,因为只有客户端和服务器具有解密数据所需的密钥。