欢迎访问宙启技术站
智能推送

Python中的CERT_OPTIONAL参数详解及使用示例

发布时间:2023-12-25 03:33:30

在Python中,可以使用CERT_OPTIONAL参数来设置请求的证书验证级别。CERT_OPTIONAL参数指定了一个可选证书验证级别,在这个级别下,如果服务器返回了证书,那么就会验证证书的有效性;如果服务器没有返回证书或者证书无效,则继续进行请求。这样,即使没有正确的证书,也不会导致请求失败。

以下是CERT_OPTIONAL参数的使用示例:

import urllib.request
import ssl

url = 'https://example.com'  # 需要访问的url
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_OPTIONAL

try:
    response = urllib.request.urlopen(url, context=context)
    data = response.read()
    print(data)
except urllib.error.URLError as e:
    print(e)

在上面的示例中,我们首先导入了urllib.requestssl模块。然后,我们指定了需要访问的url,并创建了一个默认的SSL上下文对象context。接下来,我们将check_hostname属性设置为False,这样就会禁用主机名验证。然后,我们将verify_mode属性设置为CERT_OPTIONAL,即可选的证书验证级别。

然后,我们使用urllib.request.urlopen方法发送请求,传入了url和上下文对象作为参数。如果请求顺利,我们可以通过response.read()方法来获取响应内容。如果请求失败,我们将捕获URLError异常,并打印异常信息。

需要注意的是,在使用CERT_OPTIONAL参数时,如果服务器返回了证书但是证书无效,仍然会导致URLError异常的抛出。为了解决这个问题,我们可以使用context.load_default_certs()方法来加载系统默认的证书,如下所示:

import urllib.request
import ssl

url = 'https://example.com'  # 需要访问的url
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_OPTIONAL
context.load_default_certs()

try:
    response = urllib.request.urlopen(url, context=context)
    data = response.read()
    print(data)
except urllib.error.URLError as e:
    print(e)

在上面的示例中,我们在创建上下文对象后,调用了context.load_default_certs()方法来加载系统默认的证书。这样,即使服务器返回了无效的证书,也不会导致请求失败。

总结来说,CERT_OPTIONAL参数可以在请求时指定一个可选的证书验证级别,可以保证即使服务器没有返回或者返回了无效的证书,请求仍然可以继续进行。通过context.load_default_certs()方法加载系统默认的证书,可以处理服务器返回了无效证书的情况。