我用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时会出现错误,为什么从主机调用时会出现不同的错误?
1条答案
按热度按时间rdlzhqv91#
在我的代码中发现了bug。
HTTPServer
需要用('0.0.0.0', 4443)
构造才能允许来自其他主机的连接。