在Tornado服务器上出现SSL错误

4 投票
2 回答
7649 浏览
提问于 2025-04-18 09:30

我正在尝试搭建一个HTTPS网络服务器。这里是我的代码...

import tornado.escape
import tornado.ioloop
import tornado.web
import tornado.httpserver
import settings
import os
import ssl

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/login', LoginPage),
        ]
        args = {
            'template_path': settings.TEMPLATE_PATH,
            'static_path': settings.STATIC_PATH,
            'debug': True,
            'cookie_secret': settings.COOKIE_SECRET,
            'login_url': settings.LOGIN_URL,
        }

        tornado.web.Application.__init__(self, handlers, **args)

class LoginPage(tornado.web.RequestHandler):
    def get(self):
        self.write("SSL. Yay!")


if __name__ == '__main__':
    applicaton = Application()
    ssl_options = {'certfile': os.path.join(settings.SSL_PATH, 'certificate.crt'),
                   'keyfile': os.path.join(settings.SSL_PATH, 'privateKey.key'),
    }
    http_server = tornado.httpserver.HTTPServer(applicaton, ssl_options=ssl_options)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

我使用以下命令生成了我的certificate.crt和privateKey.key文件...

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

当我运行服务器并访问localhost:8888/login时,我遇到了以下错误...

/usr/bin/python2 /home/user/dev/sslserver/main.py
WARNING:root:SSL Error on 9 ('127.0.0.1', 55303): [Errno 1] _ssl.c:509: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request
WARNING:root:SSL Error on 10 ('127.0.0.1', 55304): [Errno 1] _ssl.c:509: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request
WARNING:root:SSL Error on 9 ('127.0.0.1', 55305): [Errno 1] _ssl.c:509: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request

如果我去掉ssl_options=ssl_options,这个网页就能正常显示。请问我是不是在ssl_options里漏掉了什么参数?我对证书和SSL还很陌生,所以任何关于如何让这个工作正常的建议都非常感谢。谢谢!

2 个回答

1

你不应该在连接到 localhost 时使用SSL。SSL和HTTPS需要一个与你的域名匹配的证书来进行身份验证。

因为你连接的是 localhost,所以你的主机名(localhost)和证书上的主机名不匹配,这样就会出现证书错误。

虽然有一些方法可以绕过这个问题,但我建议你在本地机器上使用不带SSL的普通HTTP,然后在你把代码推送到服务器(使用正确的域名)时再启用SSL。

8

你需要明确地输入 https://localhost:8888 (不要只输入 localhost:8888)。如果没有加上 https:// 前缀,浏览器就会发送没有加密的 http 请求;这就是 openssl 提示的 "http request" 错误信息的意思。你不能在同一个端口上同时使用 http 和 https,但你可以在不同的端口上启动一个没有 ssl_options 的第二个 HTTPServer。

撰写回答