2017-08-16 2 views
2

Nun, ich möchte nur das folgende einfache Programm, das versucht, ein https-tunel mit www.google.com bei Port 443 zu erstellen. Ich habe zuerst den folgenden Code versucht:Python-Socket HTTP 1.1 CONNECT-Anfrage ohne gültige Antwort

import socket 

def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(("www.google.com", 80)) 
    request = "CONNECT www.google.com:443 HTTP/1.1\n\n" 
    s.send(request.encode()) 
    print(s.recv(4096).decode()) 

main() 

das Ergebnis davon war die folgende:

HTTP/1.1 405 Method Not Allowed 

Content-Type: text/html; charset=UTF-8 

Referrer-Policy: no-referrer 

Content-Length: 1592 

Date: Wed, 16 Aug 2017 07:56:14 GMT 

Connection: close 



<!DOCTYPE html> 
<html lang=en> 
    <meta charset=utf-8> 
    <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width"> 
    <title>Error 405 (Method Not Allowed)!!1</title> 
    <style> 
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px} 
    </style> 
    <a href=//www.google.com/><span id=logo aria-label=Google></span></a> 
    <p><b>405.</b> <ins>That’s an error.</ins> 
    <p>The request method <code>CONNECT</code> is inappropriate for the URL <code>/</code>. <ins>That’s all we know.</ins> 

das bedeutet, dass der Server nicht diese Anforderung ausgeführt werden erlaubt. Also dachte ich, das Problem sei die Portnummer. Also habe ich es in 443 geändert (das ist der Port für https-Verbindung). Der Code ist der:

def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(("www.google.com", 443)) 
    request = "CONNECT www.google.com:443 HTTP/1.1\n\n" 
    s.send(request.encode()) 
    print(s.recv(4096).decode()) 

main() 

Aber es druckt kein gültiges Respnse wie es sollte getan haben. Es gibt mir eine leere Antwort. Die Frage ist: "Warum passiert das? Wie kann ich es richtig funktionieren lassen?" Hinweis: Ich möchte keine integrierten urllib- oder urllib2-Bibliotheken verwenden. Ich möchte das mit Sockets machen.

+0

ändert Anfrage dazu: 'request = "GET www.google.com:443 HTTP/1.1 \ r \ n \ r \ n"' – RaminNietzsche

Antwort

1

HTTP

In Ihrer ursprünglichen Verbindung zum 80-Anschluss verwenden Sie einfach falsch Host:

import socket 


def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect(('google.com', 80)) 
    request = b'CONNECT google.com HTTP/1.1\n\n' 
    s.send(request) 
    print(s.recv(4096).decode()) 

main() 

Antwort:

HTTP/1.0 200 Connection established 

oder rechts GET Methode entfernt:

request = b'GET http://google.com HTTP/1.1\n\n' 

Antwort ist die gleiche wie HTTPS-Anfrage, google.com Host funktioniert aus irgendeinem Grund nicht.

HTTPS

Sie Ihre Steckdose in ssl Tunnels wickeln sollen (nicht sicher, ob korrekte Bezeichnung), um über HTTPS zu verbinden, und GET Methode ist gleich nach der Verbindung verwenden:

import socket 
import ssl 


def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s = ssl.wrap_socket(s) 
    s.connect(('google.com', 443)) 
    request = b'GET google.com HTTP/1.1\n\n' 
    s.send(request) 
    print(s.recv(4096).decode()) 

main() 

Antwort :

HTTP/1.1 302 Found 
Cache-Control: private 
Content-Type: text/html; charset=UTF-8 
Referrer-Policy: no-referrer 
Location: https://www.google.ru/?gfe_rd=cr&ei=WwCUWc66L6qB3APs7ZPABA 
Content-Length: 259 
Date: Wed, 16 Aug 2017 08:20:43 GMT 
Alt-Svc: quic=":443"; ma=2592000; v="39,38,37,35" 

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<TITLE>302 Moved</TITLE></HEAD><BODY> 
<H1>302 Moved</H1> 
The document has moved 
<A HREF="https://www.google.ru/?gfe_rd=cr&amp;ei=WwCUWc66L6qB3APs7ZPABA">here</A>. 
</BODY></HTML> 
+0

Zunächst einmal vielen Dank für Ihre Antwort. Zweitens, ist es sicher, dass der Code, den Sie ohne Wrapping geschrieben haben, funktioniert? Ursache habe ich interpretiert, aber nichts geändert –

+0

Ja, ich bekomme "200 Verbindung hergestellt" Antwort. Ich benutze Python 3.6, vielleicht ist das das Problem? – bakatrouble

+0

Ich benutze Python 6.2 und ich kopiere den ersten http-Code. Leider tut es nichts! Es gibt einen 405 Statuscode zurück [Methode nicht erlaubt] –