使用OpenSSL 经过代理服务器访问外部web页面

Younth_070 发布于 11/08 13:28
阅读 24
收藏 0

本人对openssl的使用不太熟悉,它包装的很好。我的小程序直接在外网环境访问HTTPS页面没有问题,但是在内网环境需要通过 HTTP的CONNECT先与代理服务器建立连接,然后与代理服务器进行client hello / server hello / cipher exchange / certificate ....

不知道要如何设置或者调用才能进行访问,内网环境浏览器本身是能够通过代理访问的,我用wireshark进行了抓包,感觉他的过程就是多了一个与代理服务器进行CONNECT方法的报文,我也尝试在Openssl中直接发送对应的CONNECT报文,然后再进行openssl的操作,但是不成功。

我有一些大概的思路代码,在调用SSL_connect的时候失败了:

// windows env.
WSAStartup(MAKEWORD(2,2),&wsaData);

//construct socket 
handle = socket(AF_INET, SOCK_STREAM, 0);

// tcp connect with middle side proxy.
connect(handle, (struct sockaddr *) &server,sizeof (struct sockaddr)); //server means the middle side proxy

// send CONNECT with middle side proxy.
/* the connect package like this:
 "CONNECT wx.qq.com:443 HTTP/1.1\n"                                                                                               
 "Host: wx.qq.com:443\n"                                                                                                          
 "Proxy-Connection: keep-alive\n"                                                                                                 
 "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36\n\n"

 */
Proxy_CONNECT_reqstr(req_str);

// now the openssl part.
SSL_load_error_strings();
 
// Register the available ciphers and digests
SSL_library_init();
OpenSSL_add_all_algorithms();

//New SSL context 
sslContext = SSL_CTX_new(SSLv23_client_method());

//SSL structure
sslHandle = SSL_new(c->sslContext);

// combine the socket with SSL 
SSL_set_fd(sslHandle , handle );

// SSL connect
SSL_connect(sslHandle); // failed.

请各位大神帮忙看下应该怎样操作,才能通过代理访问外部的web页面。

 

加载中
返回顶部
顶部