使用Python tornado搭建HTTPS网站
安装openssl
sudo apt install openssl
确认openssl.cnf所在目录/etc/ssl
生成SSL证书
生成服务器端的私钥(key文件)
$ openssl genrsa -des3 -out server.key 1024
去除key文件口令的命令
$ openssl rsa -in server.key -out server.key
生成CSR文件
$ openssl req -new -key server.key -out server.csr -config /etc/ssl/openssl.cnf
对客户端也作同样的命令生成key及csr文件
$ openssl genrsa -des3 -out client.key 1024
$ openssl req -new -key client.key -out client.csr -config /etc/ssl/openssl.cnf
CA的签名
新建目录 ca、ca/certs、ca/newcerts
在ca下建立一个空文件 index.txt
在ca下建立一个文本文件 serial, 内容0000
在ca下openssl req -new -x509 -keyout ca.key -out ca.crt -config /etc/ssl/openssl.cnf
用生成的CA的证书为刚才生成的server.csr,client.csr文件签名
$ openssl ca -in server.csr -out server.crt -cert ca/ca.crt -keyfile ca/ca.key -config /etc/ssl/openssl.cnf
$ rm ca/index.txt
$ touch ca/index.txt
$ openssl ca -in client.csr -out client.crt -cert ca/ca.crt -keyfile ca/ca.key -config /etc/ssl/openssl.cnf
应对Enter PEM pass phrase的提示
openssl rsa -in server.key -out server.key.unsecure
服务器改用这个server.key.unsecure就不会每次提示了
在Tornado网站中开启HTTPS
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()