15.5 使用OpenSSL
除了使用Python内置的SSL之外,还有一个对OpenSSL的绑定,称为pyOpenSSL,也可以用在Python中。使用pyOpenSSL和使用内置的SSL感觉上类似,它也是为socket建立一个包装(wrapper)。然而,pyOpenSSL的包装要比默认的更强大,而且功能更完整,更显著地是,它不需要您在basic-wrap.py中看到的那种为socket.ssl进行的粘合。
在您的程序使用OpenSSL之前,您需要取得pyOpenSSL。如果您的操作系统不提供,您可以从http://pyopenssl.sourceforge.net/下载。Windows的用户可以从http://twistedmatrix.com/products/ download下载一个编译好的版本。运行本节程序之前,需要安装它。这些例子需要0.5.1或以上版本。
下面是一个使用OpenSSL的基本例子:
#!/usr/bin/env python
# Basic OpenSSL example - Chapter 15 - osslbasic.py
import socket, sys
from OpenSSL import SSL
# Create SSL context object
ctx = SSL.Context(SSL.SSLv23_METHOD)
print "Creating socket...",
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "done."
# Create SSL connection object
ssl = SSL.Connection(ctx, s)
print "Establishing SSL...",
ssl.connect(('www.openssl.org', 443))
print "done."
print "Requesting document...",
ssl.sendall("GET / HTTP/1.0\r\n\r\n")
print "done."
while 1:
try:
buf = ssl.recv(4096)
except SSL.ZeroReturnError:
break
sys.stdout.write(buf)
ssl.close()
运行这个例子(您可以使用./osslbasic.py),您将看到它会使用SSL连接www.openssl.org,并取得该站点的主页。为了这样做,它首先通过调用SSL.Context建立了一个Context对象。接着,像平常那样建立一个socket。然后,建立一个SSL Connection对象,这时就不需要socket对象了。打开一个连接,进行正常的通信——就像是使用一个标准的socket。事实上,您可以把Connection对象传递给任何希望得到socket对象的函数。一旦连接被建立起来,只要对这个对象的读取代码做少许修改,它就可以和已有的代码一起工作。







