问题
I wrote a socket server using Python 2.7 and the socket module.
Everything works as expected when I issue an HTTP request: the server accepts it and answers correctly. But if instead of (let's say) http://a.com I browse for https://a.com I receive some kind of encrypted header and I don't know how to tell the client that HTTPS is not supported by the server.
I googled a bit but nothing good. I tried to reply in plain HTTP but the response is clearly ignored by the browser.
If anyone would be able to show me a way to tell the client there's no SSL it would really help me.
Thanks in advance.
回答1:
I had the same problem. You have to configure "ssl" context within your code as such:
import socket, ssl
HOST = "www.youtube.com"
PORT = 443
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_sock = context.wrap_socket(s, server_hostname=HOST)
s_sock.connect((HOST, 443))
s_sock.send(" GET / HTTP/1.1\r\nHost: www.youtube.com\r\n\r\n ".encode())
while True:
data = s_sock.recv(2048)
if ( len(data) < 1 ) :
break
print(data)
s_sock.close()
回答2:
Try this. The module names have changed so that they are now part of the http.server module (part of a standard installation) - see the note at the top of the SimpleHTTPServer documentation for Python 2. The main problem, though, is that you need to get an SSL certificate to secure connections with (the easiest way I believe is OpenSSL).
来源:https://stackoverflow.com/questions/32062925/python-socket-server-handle-https-request