ssl 如何在Python 3x中创建一个简单的HTTPS服务器

bprjcwpo  于 2024-01-08  发布在  Python
关注(0)|答案(1)|浏览(229)

我如何才能创建最好的python服务器,它只会收到一个响应,然后就死了?
我试过this,但由于一些方法被弃用,我对它做了一些修改。

  1. import http.server
  2. from ssl import SSLContext
  3. class MyHandler(http.server.SimpleHTTPRequestHandler):
  4. def do_POST(self):
  5. content_length = int(self.headers['Content-Length'])
  6. post_data = self.rfile.read(content_length)
  7. print(post_data.decode('utf-8'))
  8. server_address = ('127.0.0.1', 5000)
  9. httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
  10. httpd.socket = SSLContext().wrap_socket(sock=httpd.socket,
  11. server_side=True,
  12. do_handshake_on_connect=False,
  13. suppress_ragged_eofs=True)
  14. httpd.serve_forever()

字符串
但它不起作用。

  1. C:\Users\mikha\Desktop\Mika\Projects\yummy_slack\test_1.py:14: DeprecationWarning: ssl.SSLContext() without protocol argument is deprecated.
  2. httpd.socket = SSLContext().wrap_socket(sock=httpd.socket,
  3. C:\Users\mikha\Desktop\Mika\Projects\yummy_slack\test_1.py:14: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
  4. httpd.socket = SSLContext().wrap_socket(sock=httpd.socket,
  5. ----------------------------------------
  6. Exception occurred during processing of request from ('127.0.0.1', 51828)
  7. Traceback (most recent call last):
  8. File "C:\Program Files\Python310\lib\socketserver.py", line 316, in _handle_request_noblock
  9. self.process_request(request, client_address)
  10. File "C:\Program Files\Python310\lib\socketserver.py", line 347, in process_request
  11. self.finish_request(request, client_address)
  12. File "C:\Program Files\Python310\lib\socketserver.py", line 360, in finish_request
  13. self.RequestHandlerClass(request, client_address, self)
  14. File "C:\Program Files\Python310\lib\http\server.py", line 668, in __init__
  15. super().__init__(*args, **kwargs)
  16. File "C:\Program Files\Python310\lib\socketserver.py", line 747, in __init__
  17. self.handle()
  18. File "C:\Program Files\Python310\lib\http\server.py", line 433, in handle
  19. self.handle_one_request()
  20. File "C:\Program Files\Python310\lib\http\server.py", line 401, in handle_one_request
  21. self.raw_requestline = self.rfile.readline(65537)
  22. File "C:\Program Files\Python310\lib\socket.py", line 705, in readinto
  23. return self._sock.recv_into(b)
  24. File "C:\Program Files\Python310\lib\ssl.py", line 1274, in recv_into
  25. return self.read(nbytes, buffer)
  26. File "C:\Program Files\Python310\lib\ssl.py", line 1130, in read
  27. return self._sslobj.read(len, buffer)
  28. ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:2578)
  29. ----------------------------------------


并且此错误在一排端口中持续存在。
我不是网络方面的天才,但我真的很想知道这里出了什么问题。
主要任务是从Slack OAuth链接接收重定向的响应。

UPD:我尝试使用证书和密钥,当启动服务器时。但脚本卡在load_cert_chain上。没有崩溃或其他问题。

我使用此命令创建证书和密钥openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365,示例如下:

  1. import http.server
  2. import ssl
  3. class MyHandler(http.server.SimpleHTTPRequestHandler):
  4. def do_POST(self):
  5. content_length = int(self.headers['Content-Length'])
  6. post_data = self.rfile.read(content_length)
  7. print(post_data.decode('utf-8'))
  8. server_address = ('127.0.0.1', 5000)
  9. httpd = http.server.HTTPServer(server_address, MyHandler)
  10. context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
  11. context.load_cert_chain(certfile="cert.pem", keyfile="key.pem")
  12. httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
  13. httpd.serve_forever()

jmp7cifd

jmp7cifd1#

要创建简单的HTTPS服务器,您可以使用以下示例:

  1. import http.server
  2. import ssl
  3. def get_ssl_context(certfile, keyfile):
  4. context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
  5. context.load_cert_chain(certfile, keyfile)
  6. context.set_ciphers("@SECLEVEL=1:ALL")
  7. return context
  8. class MyHandler(http.server.SimpleHTTPRequestHandler):
  9. def do_POST(self):
  10. content_length = int(self.headers["Content-Length"])
  11. post_data = self.rfile.read(content_length)
  12. print(post_data.decode("utf-8"))
  13. server_address = ("127.0.0.1", 5000)
  14. httpd = http.server.HTTPServer(server_address, MyHandler)
  15. context = get_ssl_context("cert.pem", "key.pem")
  16. httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
  17. httpd.serve_forever()

字符串
cert.pemkey.pem是使用以下命令创建的:

  1. 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上运行的服务器。
要测试它,您可以从其他终端发送此命令:

  1. curl --cacert cert.pem -X POST -d "param1=value1&param2=value2" https://127.0.0.1:5000

展开查看全部

相关问题