在龙卷风服务器上的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.crttls.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 

它现在有效。 确实是一个脸掌时刻。