python - 如何在 Python 中验证没有根证书的 SSL 证书?

标签 python ssl https openssl pyopenssl

我想验证在根 CA 证书和服务器证书之间有一个中间证书的服务器的 SSL 证书。

如果已尝试“请求”和“httplib”包来验证证书,并且如果我提供根证书的路径(或在“请求”的情况下更新“REQUESTS_CA_BUNDLE”环境变量),两者都会成功。

但是,如果我只提供服务器证书或中间证书的路径,验证将失败。我想知道是否有任何方法可以让“请求”或“httplib”或 Python 中的任何其他包成功验证仅使用服务器或中间 CA 证书的 SSL 证书,而无需尝试追溯到根 CA 证书?

如果使用 Python 很棘手,openssl 或类似的 linux 工具是否允许这样做?

最佳答案

How to verify SSL certificates without root certificate in Python?

您可以使用其中一个从属 CA 而不是根 CA 来验证证书链。这称为路径构建,并且有一个 RFC that covers the technique .

您也可以直接使用终端实体服务器证书。只需将您的信任根植于它而不是根 CA 或从属 CA。

如果您不能使用根 CA 或从属 CA,那么您必须转向另一个方案。


这不会直接回答您的问题...您可以做的一件事是 pin the host's public key ,并放弃整个 PKI 或 PKIX 机制。

key distribution problem仍然适用,并且没有办法回避它。在 PKIX 中,您需要 CA 的根证书。固定时,您需要知道主机的公钥。

如果您没有主机公钥的先验知识,那么您可以转到Trust On First Use方案。它类似于 CertPatrol 等工具的方式工作。

固定适用于企业应用程序。在企业中,组织颁发自己的证书,因此它事先知道公钥是什么。他们甚至可以运行自己的私有(private) PKI。由于组织先验知道这些信息,因此在构建应用程序时捆绑了必要的证书。第一次使用时无需信任。

一个重要说明... RFC 7469, Public Key Pinning Extension for HTTP , 有严重缺陷。最具破坏性的是 (1) 覆盖,攻击者可以在其中破坏已知的良好 pinset; (2) 当 pinset 损坏时,错误报告被禁用。 RFC 没有很好地列出安全注意事项。

另请参阅 Peter Gutmann 的 Engineering Security .他讨论了所有这些内容。


If have tried 'requests' and also 'httplib' package...

不幸的是,我不知道你需要哪个库来做这些事情。可能没有可用的库。

关于python - 如何在 Python 中验证没有根证书的 SSL 证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41923802/

相关文章:

python - 我应该如何测试在循环中调用了多个函数?

node.js - 如何为 Express v4.13 设置 SSL 证书?

ssl - 订阅者的 Orion Context Broker HTTPS

Python:如何从sqlite数据库查询utf-8字符串

python - 除了缩进使用 2 个空格外,如何在 PyCharm IDE 中启用 PEP8 检查?

python - 如何在 Pandas 中使用另一个数据框(与字符串列相关)添加新列

C# 与 PHP 脚本通信时无法创建 SSL/TLS 安全通道异常

Grails Spring Security secureChannel 不重定向 https?

c++ - 使用 Mongoose Web 服务器进行客户端身份验证或相互身份验证

javascript - 动态 CRM 网络