Tornado服务器上的OpenSSL错误

时间:2015-02-28 16:34:44

标签: openssl docker sockjs-tornado

我使用以下命令配置我的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.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)

卷曲

卷曲端点显示:

* 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。

1 个答案:

答案 0 :(得分:1)

查看_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

现在有效。确实是一个面孔的时刻。