Python-Requests:使用自签名证书直接固定.pem

时间:2014-10-21 04:42:38

标签: python ssl

使用python-requests,如何直接为特定服务器固定自签名.pem证书,而不使用CA root bundle?

目前有可能吗?如果是的话,你能举个例子吗?

我看了http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification但不确定这是否适用于我正在尝试做的事情:

“您还可以指定本地证书作为客户端证书,作为单个文件(包含私钥和证书)或作为文件路径的元组:requests.get('https://kennethreitz.com ',cert =('/ path / server.crt','/ path / key'))响应[200]“

2 个答案:

答案 0 :(得分:3)

因为证书文件是自签名的,所以这与您通常使用请求时的工作方式相同。以下是一个循序渐进的过程:

  1. 获取自签名证书,理想情况是以某种安全的带外方式。例如,我运行的Web服务器通过自签名证书提供HTTPS访问,因此我使用scp下载了证书:

    scp <username>@<server>:/path/to/certfile.crt .
    
  2. 因为我使用的是nginx,所以它已经采用PEM格式,但是如果它不是你需要转换它。这超出了这个答案的范围。

  3. 使用内部请求中的证书文件:

    r = requests.get('https://yoursite.com/', verify='certfile.crt')
    
  4. 这就是你需要做的一切。

    如果您无法以您信任的带外方式获取证书,则可以使用浏览器获取证书。所有浏览器都允许您通过其UI导出证书。这是不太安全的:如果有人要去MITM,那么他们很可能已经开始了,并且可以为您提供他们的MITM根CA而不是您的自签名证书。

答案 1 :(得分:1)

您还可以根据指纹验证证书。 为此,您需要一个用于请求的自定义传输适配器。 可以在这里找到一个简单示例:

https://github.com/untitaker/vdirsyncer/blob/9d3a9611b2db2e92f933df30dd98c341a50c6211/vdirsyncer/utils/init.py#L198

import requests
from requests.packages.urllib3.poolmanager import PoolManager

class _FingerprintAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, fingerprint=None, **kwargs):
        self.fingerprint = str(fingerprint)
        super(_FingerprintAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       assert_fingerprint=self.fingerprint)