售前咨询
技术支持
渠道合作

使用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证书的原因。

上一篇:

下一篇:

相关新闻