c – 如何通过透明代理实现SSL隧道?

我已经阅读了SSL TUNNELING INTERNET-DRAFT of December 1995并设置了一个HTTP透明代理,可以很好地处理未加密的流量.

阅读了上述内容,以及搜索我的大脑,通过代理创建隧道以实现安全流量的可接受方法似乎是:

连接到请求的主机,然后让代理向客户端发送“HTTP 200 …”确认消息,然后从该点开始简单地传递客户端和服务器之间的所有其他数据流量.

但是,当我尝试此操作时,客户端(Chrome浏览器)会响应“HTTP 200 …”消息,其中包含三个翼形字符,我将其转发到远程主机.此时没有响应,连接失败.

在连接到主机后,这是我正在使用的代码:

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

谁能发现我的方式错误?

解决方法:

您的代码比必要的复杂得多.只需读入一个char数组,保存返回的长度,并在循环中从同一个数组中写入多个字节,直到recv()返回零. 4行代码,包括两个用于括号.不要尝试组装整个传入的消息,只是传递进来的任何内容.否则,您只是添加延迟和编程错误.完全摆脱所有strXXX()调用.

上一篇:IPv6 手工tunnel和自动tunnel


下一篇:思科 DMVPN(注释版)