传输层安全协议(TLS)算是如今互联网上应用最广泛的加密方法。
TLS的前身是安全套接层(SSL),现代互联网的许多协议基础协议都是使用TLS来验证服务器身份,并保护传输过程中的数据。
TLS能保护的信息包括:与请求URL之间的HTTPS链接以及以及返回内容、密码或cookie等可能在套接字双向传递的认证信息。
下面的信息无法使用TLS保护:本机与远程主机都是可见的,地址信息在每个数据包的IP头信息中以纯文本的形式表示。
客户端与服务器的端口号同样在每个TCP头信息中可见。
客户端为了获取服务器的IP地址,可能会先进行DNS查询。该查询在通过网络发送时也是可见的。
通过TLS加密的套接字向任何一方传递数据块的时候,观察者都可以看到数据块的大小。尽管TLS会试图隐藏确切的字节数,但是观察者仍然能看到传输数据块的大致规模。同样,也可以看到请求和响应的整体模式。
关于TLS怎么被设计出来的,那些问题这里就不说,下面说一下生成证书。
Python标准库中并没有提供私钥生成或者证书签名的相关操作。如果需要进行与这两项相关的操作,那么必须使用其他工具。openssl命令行工具就很流行而且很好用。
自己创建证书,通常要先生成两部分信息:第一部分是人工生成的,另一部分是由机器生成。人工生成的信息。人工生成的信息对证书中的描述的实体进行了文本说明,而机器会使用操作系统提供的真正的随机算法精心生成一个秘钥。
你也可以把手写的实体描述保存在一个版本控制文件中,以便今后查看。当然,你也可以直接在弹出的openssl命令提示符中输入实体描述的相关字段。
然后我们说一下TLS负载移除。
这里面先说另外一个点,为什么要直接在Python应用程序中直接进行加密操作,而不是直接使用工具。如果在另外一个端口运行这些工具的话,就可以通过它们对客户端的连接作出响应。
因此,在Python应用程序提供TLS支持的时候有两种选择:方案一是使用一个单独的守护进程或者服务提供TLS支持。方案二则是直接在Python编写的服务器代码中使用提供TLS功能的OpenSSL库。相比较于方案二,方案一更易于升级或者维护。
下面说下Python3.4之后的默认上下文,Python标准库是对OpenSSL库进行封装。当然,Python社区也在研究其他密码学的项目,包括pyOpenSSL。
Python3.4引入了ssl.create_default_context()函数,这样我们就可以轻松在Python应用程序中安全使用TLS。
这是一个简单的客户端和服务器,通过TLS套接字进行安全通信的方法。
import argparse, socket, ssl
def client(host, port, cafile=None):
purpose = ssl.Purpose.SERVER_AUTH
context = ssl.create_default_context(purpose, cafile=cafile)
raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
raw_sock.connect((host, port))
print('Connected to host{!r}and port{}'.format(host, port))
ssl_sock = context.wrap_socket(raw_sock, server_hostname=host)
while True:
data = ssl_sock.recv(1024)
if not data:
break
print(repr(data))
def server(host, port, certfile, cafile=None):
purpose = ssl.Purpose.CLIENT_AUTH
context = ssl.create_default_context(purpose, cafile=cafile)
context.load_cert_chain(certfile)
listener = socket.socket(