Python中的CERT_OPTIONAL参数详解及使用示例
在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.request和ssl模块。然后,我们指定了需要访问的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()方法加载系统默认的证书,可以处理服务器返回了无效证书的情况。
