尝试在 Python 中对 运行 SSL 包装的 BaseHTTPServer 使用 LetsEncrypt 失败

Attempting to use LetsEncrypt to run SSL-wrapped BaseHTTPServer in Python fails

我在 Python 中有一个使用 BaseHTTPServer 的工作 HTTP 服务器,所以我尝试添加一个 SSL 证书以允许使用 LetsEncrypt 的 https,现在它不会提供任何文件或响应.不会抛出异常或错误,也不会提供任何内容。

server_address = ('0.0.0.0', 80)
httpd = HTTPServer(server_address, MyHandler)
# I can comment out the following line and it'll work
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile=ssl_key, certfile=ssl_cert, server_side=True)
httpd.serve_forever()

#ssl_key = '/etc/letsencrypt/live/example.com/privkey.pem'
#ssl_cert = '/etc/letsencrypt/live/example.com/fullchain.pem'

其中 MyHandler 如下:

class MyHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(204)
        self.send_header("Content-Type", "text/html")
        self.end_headers()
        return

    def do_POST(self):
        self.send_response(204)
        self.send_header("Content-Type", "text/html")
        self.end_headers()
        return

正在尝试通过 Web 浏览器从 https://example.com returns 标准无响应 "Server not found" 访问站点。

我按照以下说明使用 LetsEncrypt 生成证书:https://certbot.eff.org/#ubuntuxenial-other

sudo apt-get install letsencrypt

其次是:

letsencrypt certonly --standalone -d example.com

有什么方法可以轻松找出问题所在?使用 Python 3.5。如果需要,很乐意提供更多信息。

server_address = ('0.0.0.0', 80)

Attempting to access the site via web browser from https://example.com returns a standard no-response "Server not found".

https://host 没有明确的端口说明意味着在 https 协议的默认端口上访问服务器,即 443。但是,您已将服务器设置为在 server_address 中使用端口 80 .

有两种方法可以解决此问题:在 URL 中明确指定 https 的非标准端口,即 https://host:80 或将 server_address 中的端口从 80 更改为443. 最后一个选项可能是更好的选项。