关于python的http.client和urllib库跳过ssl验证的方法 最后更新时间:2023年12月26日 #### http.client 在Python 3.10中,可以使用`http.client`模块中的`HTTPSConnection`类来发送HTTPS请求,并通过设置SSLContext对象来跳过SSL验证。 以下是一个示例代码,演示如何使用`http.client`模块发送HTTPS请求并跳过SSL验证: ```python import http.client import ssl # 创建SSLContext对象 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) # 跳过SSL验证 context.check_hostname = False context.verify_mode = ssl.CERT_NONE ### 请注意上面的跳过方法,可能会导致python获取到的数据报类型错误。建议采用下面的方法 content = ssl._create_unverified_context() # 创建自定义的HTTPSConnection对象 conn = http.client.HTTPSConnection('https://example.com', context=context) # 发送请求 conn.request('GET', '/') # 获取响应 response = conn.getresponse() # 读取响应内容 data = response.read() # 处理响应数据... ``` 在上面的代码中,我们首先创建了一个`SSLContext`对象,并使用`ssl.PROTOCOL_TLSv1_2`作为协议版本。然后,我们将`check_hostname`属性设置为`False`,以跳过主机名验证。同时,我们将`verify_mode`属性设置为`ssl.CERT_NONE`,以跳过证书验证。 接下来,我们创建了一个自定义的`HTTPSConnection`对象,并将自定义的SSLContext对象作为参数传递给它。然后,我们使用`request()`方法发送一个GET请求到指定的URL。最后,我们使用`getresponse()`方法获取响应,并读取响应内容。 #### urllib 看起来您正在尝试使用`urllib.request`中的`OpenerDirector`对象来发送请求,但遇到了一个TypeError,提示需要一个字符串或类似字节的对象。 在Python 3.10中,`urlopen()`方法已被弃用,并被`urlopen()`函数替代。因此,您应该使用`urlopen()`函数而不是`OpenerDirector`对象来发送请求。 下面是一个使用`urlopen()`函数发送请求的示例代码: ```python import urllib.request import ssl # 创建SSLContext对象 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) # 跳过SSL验证 context.check_hostname = False context.verify_mode = ssl.CERT_NONE ### 请注意上面的跳过方法,可能会导致python获取到的数据报类型错误。建议采用下面的方法 content = ssl._create_unverified_context() # 使用自定义的SSLContext对象来发送请求 response = urllib.request.urlopen('https://example.com', context=context) # 读取响应内容并打印输出 print(response.read().decode('utf-8')) ``` 在上面的代码中,我们使用`urlopen()`函数发送请求,并将自定义的SSLContext对象作为参数传递给它。然后,我们读取响应内容并打印输出。 请注意,使用这种方法跳过SSL验证可能会使您的应用程序容易受到中间人攻击。因此,请谨慎使用此方法,并仅在您完全信任目标网站时使用。
Comments | NOTHING