使用Tornado搭建HTTPS网站

Yeolar   2015-04-30 15:47  

Tornado 本身支持 SSL ,所以我们这里需要做的主要是生成可用的证书。

生成SSL证书

  1. 首先要生成服务器端的私钥(key文件):

    $ openssl genrsa -des3 -out server.key 1024
    

    运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!

    去除key文件口令的命令:

    $ openssl rsa -in server.key -out server.key
    
  2. 生成CSR文件:

    $ openssl req -new -key server.key -out server.csr -config openssl.cnf
    

    生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可.

  3. 对客户端也作同样的命令生成key及csr文件:

    $ openssl genrsa -des3 -out client.key 1024
    $ openssl req -new -key client.key -out client.csr -config openssl.cnf
    
  4. CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.

    1. 在bin目录下新建目录 demoCA、demoCA/certs、demoCA/certs、demoCA/newcerts
    2. 在demoCA建立一个空文件 index.txt
    3. 在demoCA建立一个文本文件 serial, 没有扩展名,内容是一个合法的16进制数字,例如 0000
    4. openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
  5. 用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:

    $ openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
    $ openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
    

ok,到了这里应该已经创建了可以使用的证书了,如果在为文件签名的时候有错误,那多半是信息不正确,这时可以去清空一下 index.txt 里的信息,然后重新执行第5步里失败的操作。

在Tornado网站中开启HTTPS

接着可以测试一下 tornado 使用 ssl 的证书了。

写个测试项目,其实也就一个py文件,像:

import os.path

from tornado import httpserver
from tornado import ioloop
from tornado import web

class TestHandler(web.RequestHandler):
    def get(self):
        self.write("Hello, World!")

def main():
    settings = {
        "static_path": os.path.join(os.path.dirname(__file__), "static"),
    }
    application = web.Application([
        (r"/", TestHandler),
    ], **settings)
    server = httpserver.HTTPServer(application, ssl_options={
           "certfile": os.path.join(os.path.abspath("."), "server.crt"),
           "keyfile": os.path.join(os.path.abspath("."), "server.key"),
    })
    server.listen(8000)
    ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

然后把相关的证书扔到 py 文件的目录下。改成相应的名字。然后开启服务。

接着用浏览器或curl啥的尝试访问一下: curl https://localhost:8000

看到请求返回的 Hello, World! 了么?恭喜你~你成功了~

PS: 附常见 SSL 错误列表: http://bugs.python.org/issue9706

在Webfaction中创建HTTPS网站

Webfaction通过控制面板可以开启Web服务的HTTPS,Webfaction自带了自签名的SSL。

需要注意的是,Webfaction的NGINX前端转发过来的请求是HTTP协议的,也就是NGINX已经完成了HTTPS解析,所以在Webfaction搭建自己的网站仍然使用HTTP即可。

如果申请的SSL证书,可以发消息给管理员,他会协助将证书安装到NGINX前端。

参考:

http://www.yeolar.com/note/2015/04/30/tornado-ssl-https/

http://www.yeolar.com/note/2015/04/30/tornado-ssl-https/