Python 套接字服务器处理 HTTPS 请求
Posted
技术标签:
【中文标题】Python 套接字服务器处理 HTTPS 请求【英文标题】:Python socket server handle HTTPS request 【发布时间】:2022-01-13 05:02:34 【问题描述】:我使用 Python 2.7 和 socket
模块编写了一个套接字服务器。
当我发出 HTTP 请求时,一切都按预期工作:服务器接受它并正确回答。但如果不是(假设)http://a.com
我浏览 https://a.com
我收到某种加密的标头,我不知道如何告诉客户端服务器不支持 HTTPS。
我用谷歌搜索了一下,但没有什么好处。我尝试使用纯 HTTP 进行回复,但浏览器显然忽略了该响应。
如果有人能告诉我一种告诉客户没有 SSL 的方法,那真的会对我有帮助。
提前致谢。
【问题讨论】:
在大多数情况下,会有一个网络服务器 (nginx/apache/etc.) 可以处理您的 python 应用程序的 SSL 和代理。运行一个网络服务器并让 python 监听一个套接字文件或锁定对本地主机的请求。 还有,***.com/questions/26851034/… 和 docs.python.org/2/library/ssl.html 我不确定是否有办法让您的连接既是 ssl 又是非。在所有情况下,我都认为您需要单独的端口,通常是 80 (http)、443 (https) 谢谢克里斯。但是如果我想要 强制客户端访问 http 呢?我知道这并不安全,只是想知道。 nginx可以配置监听,默认为https,serverfault.com/questions/10854/… 【参考方案1】:我遇到了同样的问题。您必须在代码中配置“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()
【讨论】:
以上代码仅用于处理来自客户端的 HTTPS。我相信服务器端 HTTPS 处理方式不同。 它产生错误:OSError: [WinError 10038] 尝试对不是套接字的东西进行操作。为什么会这样? 你创建了context
但不使用它?
给我这个结果:b'HTTP/1.0 400 Bad Request\r\nContent-Length: 54\r\nContent-Type: text/html; charset=UTF-8\r\n日期:格林威治标准时间 2021 年 4 月 30 日星期五 08:28:45\r\n\r\n试试this。模块名称已更改,因此它们现在是 http.server
模块的一部分(标准安装的一部分) - 请参阅 Python 2 的 SimpleHTTPServer documentation 顶部的注释。但主要问题是您需要获得 SSL 证书以保护连接(我认为最简单的方法是 OpenSSL)。
【讨论】:
以上是关于Python 套接字服务器处理 HTTPS 请求的主要内容,如果未能解决你的问题,请参考以下文章