【发布时间】:2015-02-28 16:34:44
【问题描述】:
我配置我的 Tornado 服务器:
ssl_options = {
"certfile": os.path.join("/tls.crt"),
"keyfile": os.path.join("/tls.key")
}
http = tornado.httpserver.HTTPServer(application, ssl_options=ssl_options)
tls.crt 和 tls.key 是我的域的通配符,我在 HAPROXY 后面的堆栈中的另一个应用程序中成功使用了它,后者终止了 TLS。
服务器启动时报告 OpenSSL 版本:
OpenSSL 1.0.1k 8 Jan 2015
浏览器
但是,当从浏览器获取/ 时(最终显示“此网页不可用”),这会出现在 Tornado STDOUT 中:
[E 150228 15:05:52 ioloop:588] Exception in callback (<socket._socketobject object at 0x7ff342d37050>, <function null_wrapper at 0x7ff342d418c0>)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/tornado/ioloop.py", line 840, in start
handler_func(fd_obj, events)
File "/usr/local/lib/python2.7/site-packages/tornado/stack_context.py", line 275, in null_wrapper
return fn(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/tornado/netutil.py", line 223, in accept_handler
callback(connection, address)
File "/usr/local/lib/python2.7/site-packages/tornado/tcpserver.py", line 225, in _handle_connection
do_handshake_on_connect=False)
File "/usr/local/lib/python2.7/site-packages/tornado/netutil.py", line 459, in ssl_wrap_socket
context = ssl_options_to_context(ssl_options)
File "/usr/local/lib/python2.7/site-packages/tornado/netutil.py", line 436, in ssl_options_to_context
context.load_cert_chain(ssl_options['certfile'], ssl_options.get('keyfile', None))
SSLError: [SSL] PEM lib (_ssl.c:2506)
cURL
卷曲端点显示:
* About to connect() to example.org port 443 (#0)
* Trying 54.154.175.173... connected
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* Unknown SSL protocol error in connection to example.org:443
* Closing connection #0
curl: (35) Unknown SSL protocol error in connection to example.org:443
openssl s_client
openssl s_client -connect example.org:443
坚持下去:
CONNECTED(00000003)
我已经克隆了https://github.com/openssl/openssl.git并查看了1.0.1k标签,但找不到_ssl.c,所以这里的指针将是一个好的开始。
我也将CryptoNark 指向我的域,但只是得到空输出。
主机操作系统是 AWS AMI ami-6330b7141。
应用的 Docker 容器是python:2.7 版本31ff30c97af1。
更新
_ssl.c 中的行似乎是 @benjamin-peterson 的 Python 3 backported stuff 的一部分
我将尝试使用最新的 Python 3.4。
【问题讨论】:
-
您说“Tornado 服务器出错”,但您从未发布过错误消息。听起来客户端正在连接到前端,但随后麻烦开始了。您应该确保 SSL 终止器实际终止连接,或者代理将响应传递到后端,或者将后端的响应返回给客户端。
-
您也应该尝试
openssl s_client -connect example.org:443 -tls1 -servername example.org,以防它与 SSLv3 或 SNI 相关。 -
在我的问题中查找“Tornado STDOUT”以查看错误。你的第二条评论的建议对我来说也是一样的。感谢收看。
-
我的错......我不知道为什么我没有连接这些点。所以听起来你没有有一个 HTTPS 服务器在监听 443。相反,它听起来像一个 HTTP 服务器。 “坏协议”是 SSL/TLS 客户端试图将服务器的 HTML 解释为协议数据。您必须通过查看服务器的回复来确认它。我无法回答为什么会这样,因为我不是网站管理员或管理员(我只是偶尔认出这些症状)。
标签: openssl docker sockjs-tornado