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

CERT_OPTIONAL在Python中的应用及用法介绍

发布时间:2023-12-25 03:32:37

在Python中,CERT_OPTIONAL 是一个SSLContext对象的一个常量,它指示SSL会话应该对对方证书的验证采用"可选"的模式。它在一些情况下非常有用,如在与不受信任的主机建立连接时,或者在测试环境中允许忽略证书验证。

CERT_OPTIONAL 模式下,SSL会话会尝试验证对方证书,但如果验证失败,不会立即中断连接。这意味着,即使对方证书无效或未签名,Python仍然会允许和服务器建立连接,而且不会抛出任何异常。这通常被称为"忽略证书验证",但实际上并非是完全忽略,而是将验证过程留给用户自行处理。

下面是一个使用 CERT_OPTIONAL 的简单示例:

import ssl
import urllib.request

context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_OPTIONAL

try:
    with urllib.request.urlopen("https://example.com", context=context) as response:
        print(response.read().decode('utf-8'))
except urllib.request.URLError as e:
    print("Error:", e.reason)

在上面的例子中,我们创建了一个默认的SSLContext对象,并将其check_hostname属性设置为False,这样就禁用了对主机名的检查。然后,将verify_mode属性设置为CERT_OPTIONAL,以启用"可选"的证书验证模式。

接下来,我们使用urllib.request.urlopen()方法打开一个HTTPS URL,将之前创建的SSLContext对象传递给它。如果对方证书无效或未签名,Python会继续建立连接,并返回服务器响应。但如果检测到其他SSL错误,例如证书过期或被吊销,Python将抛出URLError异常。

需要注意的是,尽管在CERT_OPTIONAL模式下,Python允许与不受信任的主机建立连接,但这并不表示你可以完全忽略证书验证。在任何安全敏感的环境中,建议仍然对对方证书进行正常验证,以确保通信的安全性。

总结起来,CERT_OPTIONAL 在Python中的应用是用于控制SSL会话在验证对方证书时的行为。它允许SSL会话继续进行,即使验证失败,但仍建议在正式环境中进行正常的证书验证。