1 SSLContext类介绍
ssl库中除了提供SSLSocket类以外,还提供了SSLContext类。相比于SSLSocket类,SSLContext提供了丰富的属性,供我们修改和查看SSL握手时的参数。
我们可以通过以下命令来实例化SSLContext实例context
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
当然,如果想直接使用默认参数,可以使用以下命令来获取一个SSLContext实例
context = ssl.create_default_context()
2 SSLContext的常用方法介绍
常用方法名 | 作用 | 备注 |
context.load_cert_chain() | ||
context.load_dh_params() | ||
context.load_ecdh_params() | ||
context.set_alpn_protocols(['http/1.1', 'spdy/2']) | 说明ssl的应用层协议,例如http,spdy等 | 如果调用了该方法,会在client hello新增一个alpn的extension |
context.set_npn_protocols(['http/1.1', 'spdy/2']) | ||
context.set_servername_callback() | ||
context.set_ciphers() | ||
context.verify_mode = ssl.CERT_REQUIRED | 对对方证书的是否验证,有三个可能值 | ssl.CERT_REQUIRED:要求对端提供证书,并验证; ssl.CERT_OPTIONAL:不要求对端提供证书,但如果提供了,就验证; ssl.CERT_NONE:不要求对端提供证书,如果提供了了,直接忽略。 |
context.load_verify_locations(ca_certs) | ||
context.check_hostname = False | 控制要不要检查要请求的hostname,和证书中的common name是否匹配 | 如果为True,client hello会新增一个sni的extension |
3 创建一个默认的SSLContext实例
import socket
import ssl
host = 'www.csdn.net'
port = 443
ca_certs = '/path/to/ca_certs.pem'
tcp_sock = socket.socket()
context = ssl.create_default_context()
ssl_sock = context.wrap_socket(tcp_sock)
ssl_sock.connect((host, port))
ssl_sock.sendall(b"HEAD / HTTP/1.0\r\nHost: {}\r\n\r\n".format(host))
while True:
rep = ssl_sock.recv(1024)
if rep:
print(rep)
break
4 自定义一个SSLContext实例,可以手动修改ssl握手报文的参数
import socket
import ssl
host = 'www.csdn.net'
port = 443
ca_certs = '/path/to/ca_certs.pem'
tcp_sock = socket.socket()
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(ca_certs)
context.check_hostname = False
ssl_sock = context.wrap_socket(tcp_sock)
ssl_sock.connect((host, port))
ssl_sock.sendall(b"HEAD / HTTP/1.0\r\nHost: {}\r\n\r\n".format(host))
while True:
rep = ssl_sock.recv(1024)
if rep:
print(rep)
break
5 结果如下
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Sun, 11 Aug 2019 10:16:22 GMT
Etag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache
Server: bfe/1.0.8.18