我怎样才能创建最简单的Python服务器,它只收到一个响应然后就死掉了?
我已经尝试过this,但由于某些方法被弃用,所以对其进行了一些修改。
import http.server
from ssl import SSLContext
class MyHandler(http.server.SimpleHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print(post_data.decode('utf-8'))
server_address = ('127.0.0.1', 5000)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = SSLContext().wrap_socket(sock=httpd.socket,
server_side=True,
do_handshake_on_connect=False,
suppress_ragged_eofs=True)
httpd.serve_forever()
但这不起作用。
C:\Users\mikha\Desktop\Mika\Projects\yummy_slack\test_1.py:14: DeprecationWarning: ssl.SSLContext() without protocol argument is deprecated.
httpd.socket = SSLContext().wrap_socket(sock=httpd.socket,
C:\Users\mikha\Desktop\Mika\Projects\yummy_slack\test_1.py:14: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
httpd.socket = SSLContext().wrap_socket(sock=httpd.socket,
----------------------------------------
Exception occurred during processing of request from ('127.0.0.1', 51828)
Traceback (most recent call last):
File "C:\Program Files\Python310\lib\socketserver.py", line 316, in _handle_request_noblock
self.process_request(request, client_address)
File "C:\Program Files\Python310\lib\socketserver.py", line 347, in process_request
self.finish_request(request, client_address)
File "C:\Program Files\Python310\lib\socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Program Files\Python310\lib\http\server.py", line 668, in __init__
super().__init__(*args, **kwargs)
File "C:\Program Files\Python310\lib\socketserver.py", line 747, in __init__
self.handle()
File "C:\Program Files\Python310\lib\http\server.py", line 433, in handle
self.handle_one_request()
File "C:\Program Files\Python310\lib\http\server.py", line 401, in handle_one_request
self.raw_requestline = self.rfile.readline(65537)
File "C:\Program Files\Python310\lib\socket.py", line 705, in readinto
return self._sock.recv_into(b)
File "C:\Program Files\Python310\lib\ssl.py", line 1274, in recv_into
return self.read(nbytes, buffer)
File "C:\Program Files\Python310\lib\ssl.py", line 1130, in read
return self._sslobj.read(len, buffer)
ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:2578)
----------------------------------------
对于连续的一堆端口,此错误仍然存在。
我不是网络天才,但真的很想了解这里出了什么问题。
主要任务是接收来自 Slack OAuth 链接的重定向响应。
UPD: 我尝试在启动服务器时使用证书和密钥。但脚本卡在了
load_cert_chain
。没有崩溃什么的。
我使用此命令创建证书和密钥
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
这里是例子:
import http.server
import ssl
class MyHandler(http.server.SimpleHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
print(post_data.decode('utf-8'))
server_address = ('127.0.0.1', 5000)
httpd = http.server.HTTPServer(server_address, MyHandler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile="cert.pem", keyfile="key.pem")
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()
要创建简单的 HTTPS 服务器,您可以使用以下示例:
import http.server
import ssl
def get_ssl_context(certfile, keyfile):
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(certfile, keyfile)
context.set_ciphers("@SECLEVEL=1:ALL")
return context
class MyHandler(http.server.SimpleHTTPRequestHandler):
def do_POST(self):
content_length = int(self.headers["Content-Length"])
post_data = self.rfile.read(content_length)
print(post_data.decode("utf-8"))
server_address = ("127.0.0.1", 5000)
httpd = http.server.HTTPServer(server_address, MyHandler)
context = get_ssl_context("cert.pem", "key.pem")
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()
使用以下命令创建
cert.pem
和 key.pem
:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
注意: 不要忘记将
Common Name (e.g. server FQDN or YOUR name) []
设置为 127.0.0.1
!
运行此脚本将创建在
127.0.0.1:5000
上运行的服务器。
要测试它,您可以从其他终端发送此命令:
curl --cacert cert.pem -X POST -d "param1=value1¶m2=value2" https://127.0.0.1:5000