2017-03-24 16 views
0

저는 파이썬으로 정말 간단한 웹 프록시를 작성하고 있습니다. 현재 HTTPS 웹 사이트를 열 수 있도록 HTTPS CONNECT 요청을 처리하고 있습니다. SSL 터널을 설정하려고하지만 내 코드가 올바르지 않습니다. 나는 가까운 사람이라고 생각하지만 누군가가 한 번 봐서 올바른 방향으로 나를 밀어 붙일 수 있다면 좋을 것입니다. 내가 어떻게해야 해요 무엇 나의 현재 이해는HTTPS CONNECT 요청 다루기

  • 는 요청이 CONNECT 요청
  • 내 코드에서 변수 connect_req에 정의 된대로 브라우저로 다시 메시지를 보내기 것을 인식이다
  • def ProxyThread(conn, client_addr): 
        request = conn.recv(MAX_BUFFER) 
        #print request 
        # Parsing 
        method, webserver, port = ParseReq(request) 
        print 'Request = ' + method + ' ' + webserver + ':' + str(port) + '\n' 
    
        try: 
         serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
         serverSocket.connect((webserver, port)) 
    
         if method == 'CONNECT': 
          connect_req = 'HTTP/1.1 200 Connection established\r\n' 
          connect_req += 'Proxy-agent: localhost\r\n\r\n' 
    
          conn.send(connect_req.encode()) 
    
         serverSocket.send(connect_req) 
    
         while 1: 
          data = serverSocket.recv(MAX_BUFFER) 
    
         # while there is data to receive from server 
          if len(data) > 0: 
           conn.send(data) 
    
          else: 
           break 
    
         serverSocket.close() 
         conn.close() 
    
        except socket.error, (message): 
         print message 
    
         if conn: 
          conn.close() 
    
         if serverSocket: 
          serverSocket.close() 
         return 
    

    편집 : 1 : 그것은 여기

내 코드입니다에 대해 그건 업데이트 된 코드에서 시작 hread 나는

def ProxyThread(conn, client_addr): 
    request = conn.recv(MAX_BUFFER) 
    method, webserver, port = ParseReq(request) 

    #Handle index out of range exception - Throw out the request 
    if method is None or webserver is None or port is -1: 
     return 

    print 'Request = ' + method + ' ' + webserver + ':' + str(port) + ' START\n' 

    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     if method == 'CONNECT': 
      connect_req = 'HTTP/1.0 200 Connection established\r\n' 
      connect_req += 'Proxy-agent: ProxyServer/1.0\r\n' 
      connect_req += '\r\n' 
      print connect_req 
      conn.send(connect_req) 
      thread = threading.Thread(target=HTTPSProxyThread, args=(conn, serverSocket)) 
      thread.start() 

     serverSocket.connect((webserver, port)) 
     serverSocket.send(request) 

     while 1: 
      data = serverSocket.recv(MAX_BUFFER) 

     # while there is data to receive from server 
      if len(data) > 0: 
       conn.send(data) 

      else: 
       break 

     print 'Request = ' + method + ' ' + webserver + ':' + str(port) + ' FINISH\n' 
     serverSocket.close() 

     conn.close() 


def HTTPSProxyThread(conn, serverSocket): 
    while 1: 
     request = conn.recv(MAX_BUFFER) 
     print request 
     method, webserver, port = ParseReq(request) 
     serverSocket.connect((webserver, port)) 
     serverSocket.send(request) 

     while 1: 
      data = serverSocket.recv(MAX_BUFFER) 

     # while there is data to receive from server 
      if len(data) > 0: 
       conn.send(data) 

      else: 
       break 

Terminal Output Firefox

답변

0

많은 사람들이 요즘은 Python으로 자신의 웹 프록시를 구축하거나, Node.js를 것 같다 HTTPS를의 REQ를 얻을 때.

웹 프록시를 만드는 데 지난 22 년을 보냈던 사람으로서 나는 사람들이 왜 그 일을 스스로하는지, 특히 모든 주요 플랫폼에서 무료 제품을 사용할 수있는 곳이 어디인지 궁금합니다. 이들 중 일부는 당신이) 이상으로 서버와 클라이언트의 놀라운 숫자에서

  • HTTP 인증을
  • 펑키 준수하지 않는 행위를 청크

    • 터널링 (CONNECT)를
    • 처리해야합니다.
    • 성능
    • 확장 성
    • 로깅
    • 캐싱
    • 정책 프레임 워크 및 집행
    • 등 잠시 동안 시간을 ​​통과하는 재미있는 방법, 이들의 이상입니다 동안

    거기에 프록시가있다면, 순진한 구현이보다 일반적인 트래픽에 사용된다면 웹이 전체적으로 더 부서지지는 않을 것입니다. 자신 만의 특정 배포 요구 사항에이 도구를 사용하는 경우이 주석을 무시하십시오.

    제가 생각하기에 요점은 웹 프록시가 잘 작동하는 웹 프록시를 만드는 것이 중요하지 않다는 것입니다.

  • +0

    대학 과제 ... –

    +0

    멋지다 - 그렇습니다. 이런 것들을 배우기 위해서는 교육적이라고 언급 했어야합니다. CONNECT를 이해하려면 먼저 실제로 HTTP 메시지인지 고려해야합니다. 클라이언트는 HTTP 메시지를 서버로 보내고 서버는 HTTP 응답을 보내야합니다. CONNECT의 경우, 응답 메시지는 업스트림 연결이 성공했는지 여부를 나타냅니다 (즉, 업스트림에 연결해야하는 프록시로 성공하면 200 응답을 보내고 파이프 라인 모드로 전환해야 함). – Adrien

    +0

    HTTP CONNECT 응답을 처리하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 현재해야 할 일에 대한 나의 현재의 이해는 'HTTP/1.0 200 Connection established \ r \ nProxy-agent : ProxyServer/1.0 \ r \ n \ r \ n'메시지를 클라이언트로 보내고 나서 약간 잃어 버렸습니다. 거기에서 무엇을하는지에 관해서. 현재 나는 보안 연결이 설정된 후에 클라이언트가 GET 요청을 보낼 것이라는 기대로 돌아가는 스레드를 가지고 있지만 단지 멈추고 아무것도하지 않습니다. –