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