在Tornado服务器上出现SSL错误
我正在尝试搭建一个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。