首页 > 解决方案 > 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 的功能。你能帮忙解答这些问题吗?

标签: pythonssl

解决方案


你知道证书是如何验证的吗?如果没有,您可以从有关 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


推荐阅读