從編程角度看SSL協議(2)ssl庫--SSLContext類

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章