boost::asioを用いたSSLによるhttp通信&プロキシサーバの使用について、質問です。
1. 番号リスト開発環境
VS2017 15.4.4
boost-vc141 1.65.1
openssl-vc140-static-64
2. 現状の問題点
プロキシサーバへ接続する(handshake)ところで、「Handshake failed: asio.ssl.stream:1」というエラーが出てしまいます。
エラーコード:1はaddress_family_not_supported = EAFNOSUPPORTに該当するのですが、どこが間違っているか分かりません。。
もしかして、ipv6設定になってしまっているのでしょうか?
3. 該当ソースコード
#include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <iostream> #include <sstream> namespace asio = boost::asio; namespace ip = asio::ip; using namespace std; int main( int argc, char* argv[] ) { try { asio::io_service io_service; asio::ssl::context context( io_service, asio::ssl::context::sslv23 ); asio::ssl::stream<ip::tcp::socket> ssl_sock( io_service, context ); //ip::address ipaddr( ip::address_v4::from_string( "43.255.22.186" ) ); //cout << ipaddr.to_string() << endl; //ip::tcp::endpoint endpoint( ipaddr, atoi( "8080" ) ); ip::tcp::resolver resolver( io_service ); ip::tcp::resolver::query query( "43.255.22.186", "8080" ); ip::tcp::endpoint endpoint( *resolver.resolve( query ) ); boost::system::error_code err = boost::asio::error::host_not_found; ssl_sock.lowest_layer().connect( endpoint, err ); if( !err ){ ssl_sock.handshake( asio::ssl::stream_base::client, err ); if( !err ){ // connect { stringstream ss_proxy; ss_proxy << "CONNECT xxxx.com:443 HTTP/1.0\r\n\r\n"; asio::streambuf req; ostream req_ostream( &req ); req_ostream << ss_proxy.str(); asio::write( ssl_sock, req ); asio::streambuf res; asio::read_until( ssl_sock, res, "\r\n" ); cout << &res << endl; } // send & recv { stringstream ss_msg; ss_msg << "GET /xxx HTTP/1.0\r\n"; ss_msg << "Host: xxxx.com \r\n"; ss_msg << "\r\n"; asio::streambuf req; ostream req_ostream( &req ); req_ostream << ss_msg.str(); asio::write( ssl_sock, req ); asio::streambuf res; asio::read_until( ssl_sock, res, "\r\n" ); cout << &res << endl; } } else { boost::system::error_code code = err; boost::system::system_error e( err ); long lastResult = code.value(); string errorString = e.what(); ssl_sock.lowest_layer().close(); cout << "Handshake failed: " << err << endl; } } else { boost::system::error_code code = err; boost::system::system_error e( err ); long lastResult = code.value(); string errorString = e.what(); ssl_sock.lowest_layer().close(); cout << "Connect failed: " << err << endl; } } catch( std::exception& e ){ cout << endl << "[EXCEPTION] " << e.what() << endl; } return 0; }
4. 該当ソースコード(修正版)
解決時の修正版コードです。
#include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <iostream> #include <sstream> namespace asio = boost::asio; namespace ip = asio::ip; using namespace std; int main( int argc, char* argv[] ) { try { // error code boost::system::error_code err = boost::asio::error::host_not_found; // sock asio::io_service io_service; ip::tcp::socket sock( io_service ); // proxy ip::tcp::resolver resolver( io_service ); ip::tcp::resolver::query query( "43.255.22.186", "8080" ); ip::tcp::endpoint endpoint( *resolver.resolve( query ) ); // connect sock.connect( endpoint, err ); if( err ){ boost::system::error_code code = err; boost::system::system_error e( err ); long lastResult = code.value(); string errorString = e.what(); sock.close(); cout << "connect failed: " << errorString << "(" << err << ")" << endl; } // send & recv { stringstream ss_proxy; ss_proxy << "CONNECT xxxx.com:443 HTTP/1.0\r\n\r\n"; asio::streambuf req; ostream req_ostream( &req ); req_ostream << ss_proxy.str(); asio::write( sock, req ); asio::streambuf res; asio::read_until( sock, res, "\r\n" ); istream is_res( &res ); string http_version; unsigned int status_code; string status_message; is_res >> http_version; is_res >> status_code; getline( is_res, status_message ); cout << "http_version: " << http_version << endl; cout << "status_code: " << status_code << endl; cout << "status_message: " << status_message << endl; } // SSL sock asio::ssl::context context( io_service, asio::ssl::context::sslv23 ); asio::ssl::stream<ip::tcp::socket> ssl_sock( io_service, context ); // move from sock to SSL sock ssl_sock.next_layer() = std::mode( sock ); // handshake ssl_sock.handshake( asio::ssl::stream_base::client, err ); if( err ){ boost::system::error_code code = err; boost::system::system_error e( err ); long lastResult = code.value(); string errorString = e.what(); ssl_sock.lowest_layer().close(); cout << "handshake failed: " << errorString << "(" << err << ")" << endl; } // send & recv { stringstream ss_msg; ss_msg << "GET /xxx HTTP/1.0\r\n"; ss_msg << "Host: xxxx.com \r\n"; ss_msg << "\r\n"; asio::streambuf req; ostream req_ostream( &req ); req_ostream << ss_msg.str(); asio::write( ssl_sock, req ); asio::streambuf res; asio::read_until( ssl_sock, res, "\r\n" ); cout << &res << endl; } } catch( std::exception& e ){ cout << endl << "[exception] " << e.what() << endl; } return 0; }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/28 06:30 編集
2017/11/28 07:27
2017/11/28 08:33
2017/11/28 09:34