欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python3使用Tornado的搭建HTTPS服務

系統 2073 0

前言

最近需要使用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                    
              
                =
              
               admin@baidu
              
                .
              
              com

              
                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! 了么?恭喜你~你成功了~


至于后面務端會出現服 Enter PEM pass phrase ,請參考我的另外一篇博客解決服務器每次都要輸入Enter PEM pass phrase

參考:

http://www.yeolar.com/note/2015/04/30/tornado-ssl-https/
https://www.jianshu.com/p/5880ae1cd595


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久人精品 | 欧美激情免费观看一区 | 夜干夜干2017最新网站 | 亚洲天堂视频在线观看免费 | 欧美黑人在线视频 | 男女拍拍拍无挡免费视频 | 欧洲免费在线视频 | 人人干人人舔 | 18sexvideo| 亚洲高清视频在线观看 | 狠狠色噜噜狠狠狠狠2018 | 视频一区二区三区免费观看 | 91久久青青草原免费 | 午夜激情爱爱 | 亚洲欧洲日本无在线码天堂 | 亚洲性人人天天夜夜摸 | 污污的网站在线观看 | 久久1区| 免费中日高清无专码有限公司 | 亚洲精品国产第1页 | 成人午夜精品一区二区三区 | 日韩一区二区三区视频 | 天天看逼 | 91久久精品国产91久久 | 成人在线视频免费 | 久草黄视频 | 嫩草影院网站 | www欧美 | 亚洲国产精品久久久 | 特黄特色的免费大片看看 | 久久精品国产免费看久久精品 | 亚洲黄区 | 亚洲自偷自偷精品 | 性久久久久久久久波多野结衣 | 看黄在线 | 一级毛片,一级毛片 | 欧美综合图区亚欧综合图区 | 免费观看欧美一级高清 | 2022国产成人精彩在线视频 | 亚洲国产aⅴ成人精品无吗 最新国产网址 | 久久亚洲高清 |