【问题标题】:How to use ssl client certificate (p12) with Scrapy?如何在 Scrapy 中使用 ssl 客户端证书(p12)?
【发布时间】:2017-09-30 01:19:24
【问题描述】:

我需要使用 p12(PKCS12) 格式的客户端证书文件与带有 scrapy 的网络服务器通信,有没有办法做到这一点?

【问题讨论】:

    标签: python scrapy client-certificates pkcs#12


    【解决方案1】:

    我无法在这里为您提供经过测试且完整的解决方案,但我知道一些地方可以通过一些调整来满足您的需求。

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

    查看source code 时,您会看到替代的BrowserLikeContextFactory 正在创建optionsForClientTLS 对象。

    该对象还可以采用clientCertificate 参数来向服务器进行身份验证。 (Details)

    所以理论上你需要继承BrowserLikeContextFactory,在那里编写你自己的creatorForNetloc方法并让它创建optionsForClientTLS,它也有一个clientCertificate

    概括地说:

    @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

    更新 PKCS12 文件转换为 p12 格式:

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

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2020-01-23
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 2013-08-04
      • 2010-10-16
      • 2017-04-28
      相关资源
      最近更新 更多