请稍候,加载中....

ssl模块

Python使用OpenSSL库实现该模块

SSL模块对socket的包装

from ssl import wrap_socket

wrap_socket方法对一个socket进行包装,并返回一个包装后的socket对象

import socket

s = socket.socket()
ssl_s = wrap_socket(s[,**options])

密钥参数options参数列表

参数名 说明
server_side 布尔值。是否以服务器或者客户端连接
True - 服务端
False - 客户端(默认)
keyfile 用来标识本地的密钥文件,pem格式,只有在使用不包含密钥的certfile下使用
certfile 用来标识本地端的证书文件,pem格式
cert_reqs 指定连接的另一端是否需要证书
CERT_NONE-忽略证书
CERT_OPTIONAL-不需要证书,如果给了证书就需验证
CERT_REQUIRED-需要证书并验证,选择该项,需要提供ca_certs参数
ca_certs 文件名,该文件包含用于验证的授权证书
ssl_version ssl协议版本,PROTOCOL_TLSv1,PROTOCOL_SSLv2,PROTOCOL_SSLv23,PROTOCOL_SSLv3(默认)
do_handshake_on_connect 布尔值。是否在连接时自动执行ssl握手。默认为True
suppress_ragged_eofs 指定read()如何处理异常EOF。如果为True,则发出普通EOF信号,否则,发出异常信号

 

ssl_s对象继承了s的方法,另外具有以下方法

方法名 说明
cipher() 返回一个元组
name - 密码名称
version - ssl协议版本
secretbits - 密码位数
do_handshake() 握手
get_peercert() 返回另一个连接端的证书,没有返回None
read([nbytes]) 最多读取并返回nbytes字节
write(data) 写入字符串,并返回写入的字节数
unwrap() 关闭连接,并返回s

 

SSL模块提供的实用函数

函数名 说明
cert_time_to_seconds(timestring) 将字符串timestring从证书使用的格式转换成兼容的time.time()的浮点数
get_server_certificate(['addr', 'ssl_version=<_SSLMethod.PROTOCOL_TLS: 2>', 'ca_certs=None']) 检索ssl服务器证书并以pem编码字符串返回
addr - (host,port)元组
ca_certs- 包含证书授权的文件名

 

ssl_soket客户端示例

s = socket()
ssl_s = ssl.wrap_socket(s)

ssl_s.connect(("www.python-xp.com", 443))
print(ssl_s.cipher())
while True:
    data = ssl_s.read()
    if not data:
        break
    print(data)

ssl_s.close()

 

ssl_socket服务端示例(伪代码)

s = socket()
....
while True:
    client, addr = s.accept()
    client_ssl = ssl.wrap_socket(client, server_side=True, certfile="***.pem")
    client_ssl.sendall(...)
    ...
    client_ssl.close()
    s.close()

Python学习手册-