gpt4 book ai didi

Python Magic(智能,双模)SSL Socket?

转载 作者:行者123 更新时间:2023-11-28 21:26:13 24 4
gpt4 key购买 nike

我正在编写一个将使用 Python 的 HTTPServer 和 BaseHTTPRequest 的应用程序。在某些时候,我认为由于用户可能想要发送的数据的敏感性,SOCKS 的实现会很有用。问题是 - 该应用程序计划在非标准端口上运行,因此如果它可以与纯文本和 SSL 连接通信,它将很有用。我找到了 there一种使 HTTPServer 使用 SSL 的方法:

import BaseHTTPServer, SimpleHTTPServer
import ssl

httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='path/to/localhost.pem', server_side=True)
httpd.serve_forever()

有没有办法创建一个可以同时处理 SSL 和明文连接的套接字类?一种检测 SSL 的巧妙方法(即一些魔术字节)?另一种方法是分配两个端口,但这不太酷。

最佳答案

我已经稍微调查了一下这个问题。很容易使套接字表现得像两个不同的服务器(取决于接收到的数据类型)。这里不好的是python的_ssl库是直接从socket._socket中读取的,它是一个原生的python对象,因此不能正常hook。

一种方法是编写一个 C 模块来挂接 native python 套接字。另一种解决方案是拥有 1 个前端和 2 个后端(https 和 http)。前端监听 4443 并决定它是否应该交换与 https 后端或 http 后端的连接。您可以将相同的处理程序添加到两个服务器,它们将以相同的方式运行。另一个问题是在后端我们不知道客户端的 ip,但是有解决方法(比如前端将保留的字典 {(前端到后端源端口号):客户端 IP},后端将查看) .

与 C 解决方案相比,第二个看起来很脏,但就是这样。

import BaseHTTPServer, SimpleHTTPServer
import ssl
import socket
import select
import threading

FRONTEND_PORT = 4443
BACKEND_PORT_SSL = 44431
BACKEND_PORT_HTTP = 44432
HOST = 'localhost'

httpd_ssl = BaseHTTPServer.HTTPServer((HOST, BACKEND_PORT_SSL), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd_ssl.socket = ssl.wrap_socket (httpd_ssl.socket, certfile='key.pem', server_side=True)

httpd_direct = BaseHTTPServer.HTTPServer((HOST, BACKEND_PORT_HTTP), SimpleHTTPServer.SimpleHTTPRequestHandler)

def serve_forever(http_server):
http_server.serve_forever()

def categorize(sock, addr):
data = sock.recv(1)
if data == '\x16':
port = BACKEND_PORT_SSL
else:
port = BACKEND_PORT_HTTP
other_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
other_sock.connect((HOST, port))
other_sock.send(data)
inp = [sock, other_sock]
select_timeout = 1.0
try:
while 1:
r,w,x = select.select(inp,[],[],select_timeout)
if not r:
continue
for s in r:
o_s = inp[1] if inp[0]==s else inp[0]
buf = s.recv(4096)
if not buf:
raise socket.error
o_s.send(buf)
except socket.error:
pass
finally:
for s in inp:
s.close()

threading.Thread(target=serve_forever, args=(httpd_ssl,)).start()
threading.Thread(target=serve_forever, args=(httpd_direct,)).start()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, FRONTEND_PORT))
sock.listen(10)

while True:
conn, addr = sock.accept()
threading.Thread(target=categorize, args=(conn, addr)).start()

关于Python Magic(智能,双模)SSL Socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13325642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com