黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python3使用Tornado的搭建HTTPS服務(wù)

系統(tǒng) 2393 0

前言

最近需要使用https搭建一個(gè)api 故簡(jiǎn)單記錄一下搭建過(guò)程
搭建http的服務(wù)簡(jiǎn)單快捷,這里就不做其他介紹

有關(guān)https的原理 請(qǐng)參考
圖解HTTPS

環(huán)境搭建(非必須)

這個(gè)環(huán)境其實(shí)不是必須的,我再搭建的時(shí)候,并沒(méi)有安裝這個(gè)環(huán)境,因?yàn)槲业膌inux服務(wù)器自帶的有了,可能 是在安裝其他軟件的時(shí)候再帶安裝上去了,所以可以自我檢測(cè)一下。

一、 安裝OpenSSL

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

  2. OpenSSL 安裝
    安裝openssl

                    
                      $ 
                      
                        sudo
                      
                      
                        apt-get
                      
                      
                        install
                      
                       openssl      
    
                    
                  

    安裝openssl開發(fā)庫(kù)

                    
                      	$ 
                      
                        sudo
                      
                      
                        apt-get
                      
                      
                        install
                      
                       libssl-dev    
    
                    
                  

    編輯器使用 bless 十六進(jìn)制編輯器,需預(yù)先安裝

                    
                      $ 
                      
                        sudo
                      
                      
                        apt-get
                      
                      
                        install
                      
                       bless
    
                    
                  
  3. 獲取 openssl.cnf (必須步驟)
    去這個(gè)目錄下 /usr/lib/ssl/openssl.cnf 拷貝出 openssl.cnf
    這是 openssl 的配置文件,下面生成證書及簽名的時(shí)候 我們將用到這個(gè)文件
    可能不同的os 此文件的位置不同,我的目錄是在 /etc/pki/CA/

            
              openssl
              
                .
              
              cnf簡(jiǎn)單釋義
vi 
              
                /
              
              usr
              
                /
              
              lib
              
                /
              
              ssl
              
                /
              
              openssl
              
                .
              
              cnf

              
                127
              
              
                [
              
               req_distinguished_name 
              
                ]
              
              
                128
              
               countryName                    
              
                =
              
               Country 
              
                Name
              
              
                (
              
              
                2
              
               letter code
              
                )
              
              ##國(guó)家名,
              
                2
              
              個(gè)字母代碼簡(jiǎn)稱

              
                129
              
               countryName_default            
              
                =
              
              
                CN
              
                ##中國(guó)就是
              
                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
              
                )
              
              ##服務(wù)器域名

              
                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一個(gè)非常留下的非阻塞式服務(wù)器框架
若想了解更多,請(qǐng)參考 官方文檔(中文版)

安裝命令:

            
              
                sudo
              
               pip 
              
                install
              
               tornado

            
          

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

三、生成證書

生成SSL證書

首先要生成服務(wù)器端的私鑰(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簽名后形成服務(wù)端自己的證書.屏幕上將有提示,依照其指示一步一步輸入要求的個(gè)人信息即可.

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

            
              $ openssl genrsa -des3 -out client.key 1024
$ openssl req -new -key client.key -out client.csr -config openssl.cnf

            
          

CSR文件必須有CA的簽名才可形成證書.可將此文件發(fā)送到verisign等地方由它驗(yàn)證,要交一大筆錢,何不自己做CA呢.
在bin目錄下新建目錄 demoCA、demoCA/certs、demoCA/newcerts
在demoCA建立一個(gè)空文件 index.txt
在demoCA建立一個(gè)文本文件 serial, 沒(méi)有擴(kuò)展名,內(nèi)容是一個(gè)合法的16進(jìn)制數(shù)字,例如 0000

這里說(shuō)明一下,在我的目錄下 /etc/pki/CA/ 已經(jīng)存在了這些certs文件夾,所以只需要在這個(gè)文件下新建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,到了這里應(yīng)該已經(jīng)創(chuàng)建了可以使用的證書了,如果在為文件簽名的時(shí)候有錯(cuò)誤,那多半是信息不正確,這時(shí)可以去清空一下 index.txt 里的信息,然后重新執(zhí)行第5步里失敗的操作。

在Tornado網(wǎng)站中開啟HTTPS

接著可以測(cè)試一下 tornado 使用 ssl 的證書了。
寫個(gè)測(cè)試項(xiàng)目,其實(shí)也就一個(gè)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
              
                (
              
              
                )
              
            
          

然后把相關(guān)的證書扔到 py 文件的目錄下。改成相應(yīng)的名字。然后開啟服務(wù)。
接著用使用 curl

            
              curl 
              
                -
              
              k https
              
                :
              
              
                /
              
              
                /
              
              localhost
              
                :
              
              
                8000
              
            
          

-k 是跳過(guò)驗(yàn)證

看到請(qǐng)求返回的 Hello, World! 了么?恭喜你~你成功了~


至于后面務(wù)端會(huì)出現(xiàn)服 Enter PEM pass phrase ,請(qǐng)參考我的另外一篇博客解決服務(wù)器每次都要輸入Enter PEM pass phrase

參考:

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論