如何在Scrapy中使用ssl客户端证书(p12)?

我需要使用格式为p12(PKCS12)的客户端证书文件与scrapy的网络服务器通信,有没有办法做到这一点?
最佳答案
我不能在这里为您提供经过测试和完整的解决方案,但我知道一些地方可能会给您一些调整,以满足您的需求.

起点是scrapy的ContextFactory对象,它定义了SSL / TLS配置.标准实现ScrapyClientContextFactory不使用客户端证书,也不进行任何服务器证书验证,它只接受任何证书. (More details)

在查看source code时,您会看到另一个BrowserLikeContextFactory正在创建optionsForClientTLS对象.

此对象还可以使用clientCertificate参数对服务器进行身份验证. (Details)

所以理论上你需要子类BrowserLikeContextFactory,在那里写你自己的creatorForNetloc方法并使它创建也有clientCertificate的optionsForClientTLS

在一个要点:

@implementer(IPolicyForHTTPS)
class ClientCertContextFactory(BrowserLikeContextFactory):

    def creatorForNetloc(self, hostname, port):
        with open('yourcert.pem') as keyAndCert:
            myClientCert = twisted.internet.ssl.PrivateCertificate.load(keyAndCert.read())
        return optionsForClientTLS(hostname.decode("ascii"),
                                   trustRoot=platformTrust(),
                                   clientCertificate=myClientCert,
                                   extraCertificateOptions={
                                        'method': self._ssl_method,
                                   })

在settings.py中激活上下文工厂:

DOWNLOADER_CLIENTCONTEXTFACTORY = 'your.package.ClientCertContextFactory'

根据文档twisted.internet.ssl.PrivateCertificate只能加载pem或asn.1格式键,意味着你必须将你的密钥转换为pem格式:

openssl pkcs12 -in client_ssl.pfx -out client_ssl.pem -clcerts

(借鉴自Converting pfx to pem using openssl)

以p12格式更新PKCS12文件的转换:

openssl pkcs12 -in client_cert.p12 -out client_cert.pem -clcerts

转载注明原文:如何在Scrapy中使用ssl客户端证书(p12)? - 代码日志