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()
讨论区