如何在Python 3x中制作一个简单的HTTPS服务器

问题描述 投票:0回答:1

我怎样才能创建最简单的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()

python ssl https request slack
1个回答
0
投票

要创建简单的 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&param2=value2" https://127.0.0.1:5000
© www.soinside.com 2019 - 2024. All rights reserved.