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

时间:2017-01-29 17:26:14

标签: python ssl https openssl pyopenssl

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

如果已经尝试过“请求”'还有' httplib'如果我向根证书提供路径(或在'请求'的情况下更新&REQUESTS_CA_BUNDLE'环境变量),则验证证书并且两者都成功。

但是,如果我只提供服务器证书或中间证书的路径,则验证失败。我想知道是否有任何方式可以提出要求'或者' httplib'或者Python中的任何其他包,只使用服务器或中间CA证书成功验证SSL证书,而不尝试追溯到根CA证书?

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

1 个答案:

答案 0 :(得分:2)

  

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

您可以使用其中一个从属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等工具的工作方式。

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

一个重要的注释...... RFC 7469, Public Key Pinning Extension for HTTP,有严重的缺陷。最具破坏性的是(1)覆盖,攻击者可以打破已知的良好pinset; (2)当pinset断开时,错误报告被禁用。 RFC没有很好地列出安全性考虑因素。

另见Peter Gutmann的Engineering Security。他讨论了所有这些问题。

  

如果尝试了'requests'和'httplib'包......

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