在龙卷风服务器上的OpenSSL错误
我configuration我的龙卷风服务器:
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
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
。
UPDATE
在_ssl.c
的行似乎是由@ benjamin-peterson Python 3 backported的东西的一部分我会尝试与最新的Python 3.4。
在查看_ssl.c
中的错误行后,问题实际上是证书(错误消息PEM lib
可能足以说明问题)。
我通过一个环境variables设置它,在原始证书文件上完成后:
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
它现在有效。 确实是一个脸掌时刻。