使用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]“
答案 0 :(得分:3)
因为证书文件是自签名的,所以这与您通常使用请求时的工作方式相同。以下是一个循序渐进的过程:
获取自签名证书,理想情况是以某种安全的带外方式。例如,我运行的Web服务器通过自签名证书提供HTTPS访问,因此我使用scp
下载了证书:
scp <username>@<server>:/path/to/certfile.crt .
因为我使用的是nginx,所以它已经采用PEM格式,但是如果它不是你需要转换它。这超出了这个答案的范围。
使用内部请求中的证书文件:
r = requests.get('https://yoursite.com/', verify='certfile.crt')
这就是你需要做的一切。
如果您无法以您信任的带外方式获取证书,则可以使用浏览器获取证书。所有浏览器都允许您通过其UI导出证书。这是不太安全的:如果有人要去MITM,那么他们很可能已经开始了,并且可以为您提供他们的MITM根CA而不是您的自签名证书。
答案 1 :(得分:1)
您还可以根据指纹验证证书。 为此,您需要一个用于请求的自定义传输适配器。 可以在这里找到一个简单示例:
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)