您的位置:首頁>正文

使用python提供HTTPS服務

Python

Python 是一種物件導向的解釋型電腦程式設計語言, 在設計中注重代碼的可讀性, 同時也是一種功能強大的通用型語言。 Python是純粹的自由軟體, 原始程式碼和解譯器CPython遵循 GPL(GNU General Public License)協定。 Python語法簡潔清晰, 特色之一是強制用空白符(white space)作為語句縮進。

在python上使用SSL有許多場景, 本文主要介紹使用python提供HTTPS服務。 (HTTPS是SSL在WEB上的應用之一)

一、使用python訪問HTTPS網站

使用python做為用戶端去訪問公網上的網站, 而這個網站為了傳輸安全(避免被劫持或者竊聽)使用了HTTPS服務, 傳輸過程內容都經過了SSL加密。 下面來看下具體的python代碼, 這裡使用的是python2.7.11, 用的是python自帶的urllib2。 當然也可以使用requests或者pycurl等協力廠商庫, 都可以, 原理都是一樣的, 只是實現的手段有些差異而已。

import urllib2

import ssl

if __name__ == ‘__main__’:

myurl=”https://www.baidu.com”

req = urllib2.Request(myurl)

try:

response = urllib2.urlopen(req)

print “HTTP return code:%d” % response.getcode()

strResult= response.read()

print strResult

except Exception ,ex:

print “Found Error :%s” % str(ex)

運行它, 就可以得到這個網站上的內容了。 並且傳輸過程都經過了加密。 是不是很簡單。 整個的傳輸過程大概是這樣的, 用戶端請求SSL連接握手(其中會跟伺服器有些SSL協議之間的交互)伺服器把自己的證書傳給用戶端,

用戶端對這個證書進行認證(每台用戶端電腦上都會預設安裝一些權威CA(證書簽發機構)的證書, 這個認證就是使用這些證書進行的, python的ssl模組會自動載入這些權威CA證書, 當然也可以自己指定, 確保這個證書是由可信的CA頒佈的, 之後就是利用證書交換金鑰後, 使用金鑰對傳輸內容進行加密傳輸。

CA證書即SSL證書(Secure Socket Layer的縮寫)是Netscape設計開發的, 用於保護伺服器和用戶端之間的線上交易。 通過在用戶端流覽器和Web伺服器之間建立一條SSL秘密頻道(Secure socket layer(SSL)安全協議。 該安全協議主要用來提供對使用者和伺服器的認證;對傳送的資料進行加密和隱藏;確保資料在傳送中不被改變,

即資料的完整性, 現已成為該領域中全球化的標準。

如果使用穀歌流覽器訪問會提示用戶:您的連接不是私密連接, 如果你強制連接則會提示不安全

import urllib2

import ssl

if __name__ == ‘__main__’:

myurl=”https://127.0.0.1:8443″

req = urllib2.Request(myurl)

try:

response = urllib2.urlopen(req)

print “HTTP return code:%d” % response.getcode()

strResult= response.read()

print strResult

except Exception ,ex:

print “Found Error :%s” % str(ex)

運行這個就會出現錯誤:

提示證書校驗錯誤。 這時如果想要訪問這樣的網站就要把用戶端的證書校驗關閉。 在前面加上一句:ssl._create_default_https_context = ssl._create_unverified_context即可

import urllib2

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

if __name__ == ‘__main__’:

myurl=”https://127.0.0.1:8443″

req = urllib2.Request(myurl)

try:

response = urllib2.urlopen(req)

print “HTTP return code:%d” % response.getcode()

strResult= response.read()

print strResult

except Exception ,ex:

print “Found Error :%s” % str(ex)

當然也可以自己創建一個不校驗的SSL上下文, 然後引用這個上下文來打開url

ctx = ssl._create_unverified_context()

然後

response = urllib2.urlopen(req,context=ctx)

二、使用OPENSSL生成證書

1、生成自簽名的證書

在使用python提供HTTPS服務之前, 我們需要先生成證書, 可以通過OPENSSL工具生成。

使用命令:openssl req -x509 -newkey rsa:2048 -nodes -days 365 -keyout private.pem -out cert.crt

之後會要求我們輸入一些組織資訊, 你可以根據你的實際情況填寫。 之後就生成了自簽名的證書cert.crt, 私密金鑰是private.pem

2、自己建立一個CA(證書簽發機構),

然後用自己的CA來頒發證書。 這個我們後面討論雙向認證的時候會用到。 詳細內容請參考http://blog.csdn.net/gx_1983/article/details/47866537

1) 保證openssl的bin目錄在path環境變數裡面。 創建一個工作目錄, 這裡我使用ca這個目錄。 然後在ca下面再創建目錄demoCA。 之後在demoCA下創建空白文字檔index.txt和serial, 並且打開serial寫入字元01

2) 先造成CA的KEY和證書

openssl req -new -x509 -days 36500 -key ca.key -out ca.crt

執行後會出現提示, 主要是要求輸入一些組織方面的資訊, 請按要求填寫即可

執行成功後會造成ca.key和ca.crt 兩個文件, ca.key為私密金鑰需要妥善保管, 不要輕易給別人。 ca.crt為證書可以隨意傳播。

3) 生成伺服器的私密金鑰和證書, 其中證書使用了CA的私密金鑰進行簽名:

l 生成server私密金鑰

openssl genrsa -out server.key 2048

l 使用server私密金鑰生成server端證書請求檔

openssl req -new -key server.key -out server.csr

一樣需要回答一些組織方面的問題

l 使用server證書請求文件通過CA生成由CA簽名的證書

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

l 驗證server證書

openssl verify -CAfile ca.crt server.crt

這樣就得到兩個檔:一個是私密金鑰server.key;一個是證書server.crt

4) 用跟3)同樣的方法生成用戶端的client.key和client.crt這兩個檔在後面的雙向認證裡面會用到

以上是自簽章憑證生成, 但這種證書並非是一種安全的證書, 極其容易被攻破。 因此, 為了避免日後的繁瑣工作以及從安全角度出發, 推薦各大開發者向受信任的CA機構(通過WEBTRUST認證)申請全球認可的SSL證書,

三、使用python提供HTTPS服務

有了證書和私密金鑰了, 下面就可以正式使用python建立一個HTTPS網站了。 這裡使用框架實現, 用的是twisted。 使用的證書是之前用OPENSSL生成的自簽章憑證。

#-* -coding: utf-8 -* –

from twisted.web import server, resource

from twisted.internet import reactor,ssl

class MainResource(resource.Resource):

isLeaf = True

# 用於處理GET類型請求

def render_GET(self, request):

# name參數

name = ‘World’

if request.args.has_key(‘name’):

name = request.args[‘name’][0]

# 設置回應編碼

request.responseHeaders.addRawHeader(“Content-Type”, “text/html; charset=utf-8”)

# 回應的內容直接返回

return ”

Hello, ” + name + “”

if __name__ == ‘__main__’:

sslContext = ssl.DefaultOpenSSLContextFactory(

‘C:/ca/private.pem, # 私密金鑰

‘C:/ca/cert.crt’ # 證書

)

site = server.Site(MainResource())

reactor.listenSSL(8080, site, sslContext)

print “監聽埠:8080”

reactor.run()

使用之前的用戶端訪問, 記得關閉證書校驗。 這時可以看到可以順利訪問。如果使用流覽器訪問,也可以正常訪問,但此時會出現安全提示,忽略這個安全提示後也可以正常訪問。

該安全提示是因為證書並非是全球受信任的SSL證書,這也是為什麼推薦使用CA機構頒發的SSL證書的原因。

文章轉載https://www.trustauth.cn/wiki/25614.html

這時可以看到可以順利訪問。如果使用流覽器訪問,也可以正常訪問,但此時會出現安全提示,忽略這個安全提示後也可以正常訪問。

該安全提示是因為證書並非是全球受信任的SSL證書,這也是為什麼推薦使用CA機構頒發的SSL證書的原因。

文章轉載https://www.trustauth.cn/wiki/25614.html

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示