概要
本文使用Python实现HTTPS的双向认证,完成客户端和服务端证书的双校验
技术名词解释
TLS:TLS(传输层安全性) 是一种广泛采用的安全协议,用于在互联网通信中提供私密性和数据安全性。它主要用于对Web应用程序和服务器之间的通信进行加密
双向认证:客户端和服务器端都需要验证对方的身份,在建立Https连接的过程中,客户端除了需要从服务器端下载服务器的公钥证书进行验证外,还需要把客户端的公钥证书上传到服务器端给服务器端进行验证,等双方都认证通过了,才开始建立安全通信通道进行数据传输
X509证书:X.509是公钥基础设施(PKI)的标准格式。X.509证书就是基于国际电信联盟(ITU)制定的X.509标准的数字证书
代码实现
import ssl
import _ssl
import urllib3
from urllib3.util import create_urllib3_context
# 客户端证书文件 PEM格式
client_cert = ''
# 客户端私钥文件 PEM格式
client_key = ''
def create_ssl_context(minimum_version=ssl.PROTOCOL_TLSv1_2, maximum_version=ssl.PROTOCOL_TLSv1_2, ca_cert=None):
context = create_urllib3_context()
# 设置 TLS 版本
context.minimum_version = minimum_version
context.maximum_version = maximum_version
context.check_hostname = False
# 客户端设置服务端证书校验
# CERT_NONE: VerifyMode 不校验
# CERT_OPTIONAL: VerifyMode 可选
# CERT_REQUIRED: VerifyMode 必选
context.verify_mode = ssl.CERT_NONE
# 如果强制校验客户端证书,则需要提供CA证书
if ca_cert is not None:
context.load_verify_locations(cafile=ca_cert) # 用于验证服务器证书
context.load_cert_chain(certfile=client_cert, keyfile=client_key) # 加载客户端证书和私钥
return context
http = urllib3.PoolManager(
ssl_context=create_ssl_context(minimum_version=_ssl.PROTO_TLSv1_2, maximum_version=_ssl.PROTO_TLSv1_2,
ca_cert=None)
)
url = ''
# 后续就可以使用http实例进行请求了,比如
response = http.request('GET', url)