Tornado 服务器上的 OpenSSL 错误
OpenSSL error on Tornado server
我将我的 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
浏览器
然而,当从浏览器获取 /
时(最终显示 "This web page is not available"),这出现在 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 指向我的域,但只得到空输出。
主机 OS 是 AWS AMI ami-6330b7141
。
应用程序的 Docker 容器是 python:2.7
版本 31ff30c97af1
。
更新
_ssl.c
中的行似乎是@benjamin-peterson Python 3 backported stuff 的一部分
我会尝试使用最新的 Python 3.4.
查看 _ssl.c
中的错误行后,问题实际上出在证书上(错误消息 PEM lib
可能足以说明这一点)。
我通过环境变量设置它,在对原始证书文件执行此操作后:
awk 1 ORS='\n' star.example.org.cert
然后在我的 Python 应用中:
with open('/tls.crt', 'w') as crt:
crt.write(os.environ.get('SSL_CRT'));
问题是,那些换行符仍然是 \n
,所以我将这一步移到了 Bash 脚本:
if [ -n "$SSL_CRT" ]; then
rm /tls.crt
echo "SSL certificate provided!"
echo -e "${SSL_CRT}" > /tls.crt
else
echo "No SSL certificate provided"
fi
python app.py
现在可以了。确实是一个打脸的时刻。
我将我的 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
浏览器
然而,当从浏览器获取 /
时(最终显示 "This web page is not available"),这出现在 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 指向我的域,但只得到空输出。
主机 OS 是 AWS AMI ami-6330b7141
。
应用程序的 Docker 容器是 python:2.7
版本 31ff30c97af1
。
更新
_ssl.c
中的行似乎是@benjamin-peterson Python 3 backported stuff 的一部分
我会尝试使用最新的 Python 3.4.
查看 _ssl.c
中的错误行后,问题实际上出在证书上(错误消息 PEM lib
可能足以说明这一点)。
我通过环境变量设置它,在对原始证书文件执行此操作后:
awk 1 ORS='\n' star.example.org.cert
然后在我的 Python 应用中:
with open('/tls.crt', 'w') as crt:
crt.write(os.environ.get('SSL_CRT'));
问题是,那些换行符仍然是 \n
,所以我将这一步移到了 Bash 脚本:
if [ -n "$SSL_CRT" ]; then
rm /tls.crt
echo "SSL certificate provided!"
echo -e "${SSL_CRT}" > /tls.crt
else
echo "No SSL certificate provided"
fi
python app.py
现在可以了。确实是一个打脸的时刻。