与HTTPS Python Web服务器通信时, curl 失败,并显示SSL错误56和35

ao218c7q  于 2023-03-19  发布在  Python
关注(0)|答案(1)|浏览(224)

我用Python设置了自己的HTTPS服务器:

from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, secure world!\n')

httpd = HTTPServer(('127.0.0.1', 4443), SimpleHTTPRequestHandler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(
        certfile="/etc/letsencrypt/live/.../fullchain.pem",
        keyfile="/etc/letsencrypt/live/.../privkey.pem")
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()

出于安全考虑,我的服务器在VirtualBox VM中运行,端口从443转发到4443。当我在VM上通过curl本地查询HTTPS服务器时,我得到了响应,但也出现了错误:

$ curl -k 'https://locahost:4443'
Hello, secure world!
curl: (56) OpenSSL SSL_read: error:0A000126:SSL routines::unexpected eof while reading, errno 0

但是,当我试图从主机查询它时,我只得到一个错误:

$ curl -k 'https://127.0.0.1'
curl: (35) Unknown SSL protocol error in connection to 127.0.0.1:443

正如您所看到的,在这两个调用中我都禁用了证书验证,因为我是通过IP地址而不是实际的域来查询服务器的。证书是针对我的个人域的,并且由letsencrypt.com签名。当我尝试在主机上使用实际的域时,我得到了相同的错误(34)。
为什么在客户机VM中调用curl时会出现错误,为什么从主机调用时会出现不同的错误?

rdlzhqv9

rdlzhqv91#

在我的代码中发现了bug。HTTPServer需要用('0.0.0.0', 4443)构造才能允许来自其他主机的连接。

相关问题