从编程角度看SSL协议(2)ssl库--SSLContext类

本文深入解析Python ssl库中的SSLContext类,介绍了如何实例化SSLContext并设置SSL握手参数,包括应用层协议、证书验证模式、主机名检查等功能,以及如何自定义SSLContext实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com'
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.youkuaiyun.com'
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值