一代明君的小屋 - 验证
type: channel
link: https://yidaimingjvn.xyz/index.php/tag/验证/
items: 关于python的http.client和urllib库跳过ssl验证的方法

关于python的http.client和urllib库跳过ssl验证的方法
type: item
date: 2023-12-26T09:55:12+08:00
description: http.client在Python 3.10中，可以使用http.client模块中的HTTPSConnection类来发送HTTPS请求，并通过设置SSLContext对象来跳过SSL验证。以下是一个示例代码，演示如何使用http.client模块发送HTTPS请求并跳过SSL验证：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()函数发送请求的示例代码：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验证可能会使您的应用程序容易受到中间人攻击。因此，请谨慎使用此方法，并仅在您完全信任目标网站时使用。