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