python3使用Tornado的搭建HTTPS服務

原創:https://blog.csdn.net/clinuxf/article/details/90403935

前言

最近需要使用https搭建一個api 故簡單記錄一下搭建過程
搭建http的服務簡單快捷,這裏就不做其他介紹

有關https的原理 請參考
圖解HTTPS

環境搭建(非必須)

這個環境其實不是必須的,我再搭建的時候,並沒有安裝這個環境,因爲我的linux服務器自帶的有了,可能 是在安裝其他軟件的時候再帶安裝上去了,所以可以自我檢測一下。

一、 安裝OpenSSL

  1. OpenSSL 介紹
    OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
    SSL是Secure Sockets Layer(安全套接層協議)的縮寫,可以在Internet上提供祕密性傳輸。SSL能使用戶/服務器應用之間的通信不被攻擊者竊聽,並且始終對服務器進行認證,還可選擇對用戶進行認證。SSL協議要求建立在可靠的傳輸層協議(TCP)之上。

  2. OpenSSL 安裝
    安裝openssl

    $ sudo apt-get install openssl
    安裝openssl開發庫
    $ sudo apt-get install libssl-dev
    編輯器使用 bless 十六進制編輯器,需預先安裝
    $ sudo apt-get install bless
     
  3. 獲取 openssl.cnf(必須步驟)
    去這個目錄下 /usr/lib/ssl/openssl.cnf 拷貝出 openssl.cnf
    這是 openssl 的配置文件,下面生成證書及簽名的時候 我們將用到這個文件
    可能不同的os 此文件的位置不同,我的目錄是在/etc/pki/CA/

openssl.cnf簡單釋義
vi /usr/lib/ssl/openssl.cnf
127 [ req_distinguished_name ]
128 countryName                    = Country Name (2 letter code)##國家名,2個字母代碼簡稱
129 countryName_default            = CN  ##中國就是CN
130 countryName_min                = 2
131 countryName_max                = 2
132
133 stateOrProvinceName            = State or Province Name (full name)##州或省的名字
134 stateOrProvinceName_default    = beijing
135
136 localityName                    = Locality Name (eg, city)  ##本地城市名
137 localityName_default            =beijing
138 0.organizationName              = Organization Name (eg, company) ##組織(公司)名
139 0.organizationName_default      = beijing www company
140
145 organizationalUnitName          =Organizational Unit Name(eg,section)##組織單元(部門)名
146 organizationalUnitName_default  = www
147
148 commonName                      = Common Name(e.g.server FQDN or YOUR name)##服務器域名
149 commonName                      = www.baidu.com
150 commonName_max                  = 64
151
152 #emailAddress                  = Email Address      ##Email地址
153 emailAddress                    = [email protected]
154 emailAddress_max                = 64
155
156 # SET-ex3                      = SET extension number 3
157
158 [ req_attributes ]
159 #challengePassword              = A challenge password  ##修改密碼
160 challengePassword              =
161
163 challengePassword_min          = 4
164 challengePassword_max          = 20
二、 安裝Tornado

Tornado是目前python一個非常留下的非阻塞式服務器框架
若想了解更多,請參考 官方文檔(中文版)

安裝命令:

sudo pip install tornado
Tornado 本身支持 SSL ,所以我們這裏需要做的主要是生成可用的證書。

三、生成證書

生成SSL證書

首先要生成服務器端的私鑰(key文件)

$ openssl genrsa -des3 -out server.key 1024
生成CSR文件

將之前的openssl.cnf 拷貝到所需目錄中

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

生成Certificate Signing Request(CSR),生成的csr文件交給CA簽名後形成服務端自己的證書.屏幕上將有提示,依照其指示一步一步輸入要求的個人信息即可.

對客戶端也作同樣的命令生成key及csr文件:

$ openssl genrsa -des3 -out client.key 1024
$ openssl req -new -key client.key -out client.csr -config openssl.cnf
CSR文件必須有CA的簽名纔可形成證書.可將此文件發送到verisign等地方由它驗證,要交一大筆錢,何不自己做CA呢.
在bin目錄下新建目錄 demoCA、demoCA/certs、demoCA/newcerts
在demoCA建立一個空文件 index.txt
在demoCA建立一個文本文件 serial, 沒有擴展名,內容是一個合法的16進制數字,例如 0000

這裏說明一下,在我的目錄下/etc/pki/CA/已經存在了這些certs文件夾,所以只需要在這個文件下新建index.txt, serial即可

openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
 

用生成的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"),
            #我的代碼是吧.改成了/home/SSLCertificate,其他不變
    })
    server.listen(8000)
    ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()
然後把相關的證書扔到 py 文件的目錄下。改成相應的名字。然後開啓服務。

接着用使用 curl

curl -k https://localhost:8000
 

-k是跳過驗證

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章