python - python ssl编码中`context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")`的作用是什么?
问题描述
我按照教程编写了一个 Python ssl 演示。
import ssl
import socket
HOSTNAME = "www.cloudflare.com"
context = ssl.create_default_context()
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
#context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=HOSTNAME)
conn.connect((HOSTNAME, 443))
# cert = conn.getpeercert()
#
# print(cert)
这行代码看不懂,有什么作用?
context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
我在我的 macOS 中运行它,我不知道我可以访问哪个路径ca-bundle.crt
,也不知道ca-bundle.crt
's 的功能。你能帮忙解答这些问题吗?
解决方案
你知道证书是如何验证的吗?如果没有,您可以从有关 PKI 的 Wikipedia 页面开始。
简单来说。证书由证书颁发机构签署。我们信任这些机构,因为他们会检查认证请求中的所有声明。因此,如果一个站点为stackoverflow.com
受信任的 CA 提供证书并由其签名,那么我们认为它确实是 Stackoverflow。
可信权威的集合很小。几十个。他们的公钥作为证书与操作系统、浏览器、openssl 发行版一起分发。这些证书称为根证书。
该调用context.load_verify_locations("/etc/ssl/certs/ca-bundle.crt")
加载了 openssl 维护者信任的 CA 的根证书列表。该证书列表存储在文件中/etc/ssl/certs/ca-bundle.crt
。
但在 MacOS 中,不需要此调用。默认 OpenSSL 发行版从操作系统加载 CA 证书。证书cloudflare.com
由 DigiCert 颁发。这是所有浏览器和操作系统都信任的信誉良好的 CA。他们的证书存储在 MacOS 中,并在您初始化默认上下文时加载到您的进程中。
供参考。该常量ssl.PROTOCOL_SSLv23
用词不当,自 python 3.6 以来已被弃用。改为使用ssl.PROTOCOL_TLS
。
推荐阅读
- python - 在 Python 中使用非零元素保存索引值
- c# - 无法在 .NET Core 中注册嵌套的通用接口
- reactjs - 在 useEffect 中调用 useRef 得到 Invalid hook call 错误
- r - 更改绘图热图中的颜色条标签 (R)
- sql - 从开始和结束字符相同的字符串中检索文本
- java - 如何从对象列表中获取指定字段值最大的元素
- vue.js - 如何在 vue-cli 中使用`localIdentName`
- javascript - Angular 2 中无法识别自定义指令
- java - Setter 和 Getter
- vba - 如何根据来自另一个单元格范围的输入对二维单元格范围进行编号?