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等第三方库,都可以,原理都是一样的,只是实现的手段有些差异而已。ssl证书申请
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)