Python的请求:直接的。佩姆用自签名钉住

2024-06-16 17:48:47 发布

您现在位置:Python中文网/ 问答频道 /正文

使用python请求,如何在不使用CA根包的情况下直接为特定服务器固定自签名的.pem证书?在

目前有可能吗?如果是,你能提供一个例子吗?在

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

“您还可以指定一个本地证书作为客户端证书,作为单个文件(包含私钥和证书)或作为两个文件路径的元组使用:请求.get('https://kennethreitz.com',证书=('/path)/服务器.crt“,'/path/key'))响应[200]”


Tags: 文件pathorg服务器httpdocs情况requests
5条回答

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

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)

因为证书文件是自签名的,所以它的工作方式与处理请求时的正常情况相同。以下是一个循序渐进的过程:

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

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

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

    r = requests.get('https://yoursite.com/', verify='certfile.crt')
    

这就是你要做的。在

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

相关问题 更多 >