项目中遇到一个特殊场景,只有证书链中的二级ca证书,服务器校验时只能调用二级去校验HTTPS,对pyopenssl研究了下源码,提取了一部分,可以直接注射到urllib3中,试了下urllib也是可以使用的
做HTTPS双向认证时,会经常校验证书,也比较麻烦
import OpenSSL
import ssl
from urllib3 import util
from urllib3.contrib import pyopenssl
class Verify_cert(pyopenssl.PyOpenSSLContext):
@staticmethod
def verify_callback(cnx, x509, err_no, err_depth, return_code):
if err_depth != 0:
return True
return err_no == 0
@property
def verify_mode(self):
return ssl.CERT_REQUIRED
@verify_mode.setter
def verify_mode(self, value):
self._ctx.set_verify(OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
Verify_cert.verify_callback)
def inject_into_urllib3():
pyopenssl._validate_dependencies_met()
util.SSLContext = Verify_cert
util.ssl_.SSLContext = Verify_cert
util.HAS_SNI = True
util.ssl_.HAS_SNI = True
util.IS_PYOPENSSL = True
util.ssl_.IS_PYOPENSSL = True