【问题标题】:SSL error on tornado server龙卷风服务器上的 SSL 错误
【发布时间】:2014-08-02 06:25:58
【问题描述】:

我正在尝试制作一个 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 的新手,所以任何关于如何让这个工作的建议都将不胜感激。谢谢!

【问题讨论】:

    标签: python ssl certificate tornado


    【解决方案1】:

    您不应使用 SSL 连接到 localhost 主机名连接。 SSL + HTTPS 使用带有您的域名的证书,并使用它来提供身份验证。

    由于您连接到localhost,您的主机名 (localhost) 将与证书上的主机名不匹配,您将收到证书错误。

    有一些方法可以解决这个问题,但我只会在您的本地计算机上使用非 SSL(常规 HTTP),然后当您推送到您的服务器(使用您的正确域名)时,您可以启用 SSL。

    【讨论】:

    • 感谢您的回复。在我发布回复后,我几乎立即想到了这一点。如果我在 URL 中明确指定 https,则 SSL 可以在远程计算机上运行。
    【解决方案2】:

    您需要明确转到https://localhost:8888(不仅仅是localhost:8888)。如果没有 https:// 前缀,浏览器会发送未加密的 http;这就是来自 openssl 的“http 请求”错误消息的含义。您不能在同一个端口上提供 http 和 https,但您可以在不同的端口上启动第二个没有 ssl_options 的 HTTPServer。

    【讨论】:

    • 这行得通。现在我只需要弄清楚当用户刚刚输入 http 时如何强制使用 https。现在如果用户输入 mydomain:8888 它默认为 http 并且网页不会加载。我需要它将它们重定向到 https。你知道我会怎么做吗?
    • 你不能。 HTTP 和 HTTPS 必须使用不同的端口,并且没有实用的方法可以使错误的 url 起作用。如果您在默认端口 80/443 上运行,那么浏览器将知道自动切换端口,但对于非默认端口,浏览器将完全按照您的指示进行操作。
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多