私はSSL TUNNELING INTERNET-DRAFT of December 1995を読んで、暗号化されていないトラフィックに完全に対応するHTTP透過プロキシを設定しました。トランスペアレントプロキシ経由でSSLトンネルを実装する方法は?
は、上記を読んで、だけでなく、私の脳をGoogleで検索したので、プロキシ経由でセキュアなトラフィック用のトンネルを作成するために用いられる方法は、のようだ:
、プロキシが送ってきた、要求されたホストへの接続します"HTTP 200 ..."という確認メッセージがクライアントに返され、その時点からクライアントとサーバー間のそれ以上のすべてのデータトラフィックが単純に渡されます。
私はこれを試すと、クライアント(Chromeブラウザ)が "HTTP 200 ..."メッセージに3つのwingdings文字で応答し、リモートホストに転送します。この時点では応答は返っておらず、接続は失敗します。ここで
は、私がホストに接続された後、これを使用していたコードは次のとおりです。
if((*request=='C')&&(*(request+1)=='O')&&(*(request+2)=='N')&&(*(request+3)=='N'))
{
int recvLen;
send(output,htok,strlen(htok),0); //htok looks like "HTTP/1.0 200 Connection Established\nProxy-Agent: this_proxy\r\n\r\n"
std::memset(buff,0,bSize);
int total;
int bytes;
int n;
char cdata[MAXDATA];
while ((recvLen = recv(output, buff, bSize-1,0)) > 0) //recving from client - here we get wingdings
{
memset(cdata,0, MAXDATA);
strcat(cdata, buff);
while(recvLen>=bSize-1)//just in case buff is too small
{
std::memset(buff,0,bSize);
recvLen=recv(output,buff,bSize-1,0);
strcat(cdata, buff);
}
total = 0;
bytes = strlen(cdata);
cout << cdata << endl;//how I see the wingdings
while (total < strlen(cdata))
{
n = send(requestSock, cdata + total, bytes,0);//forwarding to remote host
if(n == SOCKET_ERROR)
{
cout << "secure sending error" << endl;
break;
}
total += n;
bytes -= n;
}
std::memset(buff,0,bSize);
recvLen=recv(requestSock, buff, bSize,0);//get reply from remote host
if (recvLen > 0)
{
do
{
cout<<"Thread "<<threadid<<" [Connection:Secure]: "<<recvLen<<endl;
send(output, buff, recvLen,0);//forward all to client
recvLen= recv(requestSock, buff, bSize,0);
if(0==recvLen || SOCKET_ERROR==recvLen)
{
cout<<"finished secure receiving or socket error"<<endl;
break;
}
}while(true);
}
}//end while, loop checks again for client data
誰もが私の方法のエラーを見つけることができますか?
send()コールはrecvLen未満を送信でき、この事実は無視します。別の問題は、SSLのバイナリデータをテキストとして扱うことです(あなたのコードはテキストHTTPリクエストでは動作しますが、バイナリデータでは失敗します)。 –