Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字服务器处理HTTPS请求_Python_Sockets_Ssl_Https - Fatal编程技术网

Python套接字服务器处理HTTPS请求

Python套接字服务器处理HTTPS请求,python,sockets,ssl,https,Python,Sockets,Ssl,Https,我使用Python2.7和socket模块编写了一个套接字服务器 当我发出HTTP请求时,一切都按预期工作:服务器接受它并正确回答。但是如果不是(比如说)http://a.com我浏览https://a.com我收到某种加密的头,我不知道如何告诉客户端服务器不支持HTTPS 我在谷歌上搜索了一下,但没什么用。我试图用纯HTTP回复,但浏览器显然忽略了响应 如果有人能告诉我一种告诉客户机没有SSL的方法,这对我真的很有帮助 提前谢谢。我也有同样的问题。您必须在代码中配置“ssl”上下文,如下所示:

我使用Python2.7和
socket
模块编写了一个套接字服务器

当我发出HTTP请求时,一切都按预期工作:服务器接受它并正确回答。但是如果不是(比如说)
http://a.com
我浏览
https://a.com
我收到某种加密的头,我不知道如何告诉客户端服务器不支持HTTPS

我在谷歌上搜索了一下,但没什么用。我试图用纯HTTP回复,但浏览器显然忽略了响应

如果有人能告诉我一种告诉客户机没有SSL的方法,这对我真的很有帮助


提前谢谢。

我也有同样的问题。您必须在代码中配置“ssl”上下文,如下所示:

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()
导入套接字,ssl
HOST=“www.youtube.com”
端口=443
context=ssl.SSLContext(ssl.PROTOCOL_TLSv1)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s_sock=context.wrap_socket(服务器\u主机名=主机)
s_sock.connect((主机,443))
s_sock.send(“GET/HTTP/1.1\r\nHost:www.youtube.com\r\n\r\n.encode())
尽管如此:
数据=s_sock.recv(2048)
如果(len(数据)<1):
打破
打印(数据)
s_sock.close()

试试看。模块名称已更改,因此它们现在是
http.server
模块(标准安装的一部分)的一部分-请参阅Python 2顶部的注释。不过,主要的问题是,您需要获得SSL证书来保护与的连接(我认为最简单的方法是)。

在大多数情况下,会有一个Web服务器(nginx/apache/等)来处理SSL和python应用程序的代理。运行一个Web服务器,让python监听套接字文件,或者只锁定对localhost的请求。另外,我不确定是否有办法让您的连接同时使用ssl和非ssl。在所有情况下,我都认为您需要单独的端口,通常是80(http)、443(https)。但是如果我想强制客户端使用http呢?我知道这是不安全的,但我只是想知道。nginx可以配置为在这两者上侦听,并且默认为https,上面的代码仅用于从客户端处理https。我认为服务器端HTTPS处理的方式有所不同。它会产生错误:OSError:[WinError 10038]尝试对非套接字的对象执行操作。为什么会这样?您创建了
上下文
但不使用它?给出了以下结果:b'HTTP/1.0 400错误请求\r\n内容长度:54\r\n内容类型:text/html;charset=UTF-8\r\n日期:2021年4月30日星期五08:28:45 GMT\r\n\r\n错误400(错误请求)!!1'