【发布时间】:2016-05-14 13:57:00
【问题描述】:
首先我确实搜索了我的问题,但要找到这个主题的确切答案并不容易。
我编写了一个小型 C++ 程序,它通过 SOCKS5 代理连接到 HTTP 网站。这一切都很好。现在我想连接到一个 HTTPS 网站,这造成了一些麻烦..
问题是我不能直接创建 BIO* 并连接到 SOCKS5 代理,我需要先使用未加密的套接字执行 SOCKS5 协议,然后将其转换为 BIO*。我说得对吗?
所以我为正常的 TCP->SOCKS5->网站内容截取了这段代码:
SOCKS5_Greeting_Response socks_gresp;
SOCKS5_Command_Response socks_cresp;
int sock = createSocket();
socketConnect(sock, "127.0.0.1", 9050);
socks_gresp = socketWriteSOCKS5Greeting_TOR(sock);
if(socks_gresp.Version == 5){
std::cout << "[i] Version match!" << std::endl;
}
socks_cresp = SOCKS5_Connect(sock, get_IPv4("www.google.de"), 80);
if(socks_cresp.Reply == 0){
std::cout << "[i] Connection success!" << std::endl;
}
else if(socks_cresp.Reply == 1){
std::cout << "[i] General server error" << std::endl;
}
else if(socks_cresp.Reply == 3){
std::cout << "[i] Network not reachable" << std::endl;
}
else if(socks_cresp.Reply == 5){
std::cout << "[i] Connection refused!" << std::endl;
}
之后我可以从 sock 读取/写入,我不想发布所有子功能,因为它会太多......
我在这里读到:Link 1 我应该使用 BIO_new_socket() 和 SSL_set_bio()
我在这里找到了一段代码:Link 2
所以这是我当前的代码片段,试图将 TCP Socket 转换为 BIO*(没有所有错误处理的东西,当一切正常时我将其包括在内):
SSL_library_init();
SOCKS5_Greeting_Response socks_gresp;
SOCKS5_Command_Response socks_cresp;
int sock = createSocket();
socketConnect(sock, "127.0.0.1", 9050);
socks_gresp = socketWriteSOCKS5Greeting_TOR(sock);
if(socks_gresp.Version == 5){
std::cout << "[i] Version match!" << std::endl;
}
socks_cresp = SOCKS5_Connect(sock, get_IPv4("www.google.de"), 443);
if(socks_cresp.Reply == 0){
std::cout << "[i] Connection success!" << std::endl;
}
else if(socks_cresp.Reply == 1){
std::cout << "[i] General server error" << std::endl;
}
else if(socks_cresp.Reply == 3){
std::cout << "[i] Network not reachable" << std::endl;
}
else if(socks_cresp.Reply == 5){
std::cout << "[i] Connection refused!" << std::endl;
}
//--
BIO* sslsock = BIO_new_socket(sock, BIO_NOCLOSE);
SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method());
SSL_CTX_load_verify_locations(ctx, "/path/to/cacert.pem", NULL);
SSL* ssl = SSL_new(ctx);
SSL_set_bio(ssl, sslsock, sslsock);
std::cout << "[i] SSL Write: " << SSL_write(sslsock, generate_basic_GET_request("www.google.de","Mozilla","")) << std::endl;
std::cout << SSL_read(sslsock) << std::endl;
SSL_Close_Connection(sslsock);
//--
closeSocket(sock);
我的 SSL_write() 将在错误时打印出
[i] Version match!
[i] Connection success!
[i] SSL Write: 191
F
我应该在那里看到 HTML 源或 HTTP 响应,而不是“F”。我很确定我在创建 BIO* 时做错了什么,但我不知道是什么。这里有人可以吗?
【问题讨论】: