Python Twisted Scrapy AttributeError: 'DefaultOpenSSLContextFactory' object has no attribute 'privateKey'

Python Twisted Scrapy AttributeError: 'DefaultOpenSSLContextFactory' object has no attribute 'privateKey'

在这段代码中,我尝试将证书 .key 和 .pem 文件用于我有权使用的私有页面。

from OpenSSL import SSL
from twisted.internet import ssl

class BrowserLikeContextFactory(ScrapyClientContextFactory):


        def creatorForNetloc(self, hostname, port):


            certificate = ssl.DefaultOpenSSLContextFactory('path\sample.key','path\sample.pem')

            return optionsForClientTLS(hostname.decode("ascii"),
                trustRoot=platformTrust(),
                clientCertificate=certificate,
                extraCertificateOptions={
                'method': self._ssl_method,
                    })

这两个文件存在于指定的路径中。我在 Scrapy 中尝试了一个 fetch 命令,这是第一个结果。

但是,输入PEM pass phrase后,却遇到了这个错误?我该如何解决?

这不是您问题的确切答案,但评论太长了。我发现不处理一次性证书(如自签名证书或 local/private 服务器的证书)更容易。我在这样的事情上取得了成功(取自 treq 项目,但应该也适用于 scrapy,并进行一些调整):

import re

from twisted.internet import ssl
from twisted.web.iweb import IPolicyForHTTPS
from twisted.web.client import BrowserLikePolicyForHTTPS, Agent
from zope.interface import implementer

@implementer(IPolicyForHTTPS)
class RegexContextFactory:

    defaultPolicy = BrowserLikePolicyForHTTPS()

    def __init__(self, re_domains):
        self.re_domains = re.compile(re_domains)

    def creatorForNetloc(self, hostname, port):
        if self.re_domains.match(hostname) != None:
            return ssl.CertificateOptions(verify=False)
        return self.defaultPolicy.creatorForNetloc(hostname, port)

# Replace regex with one that will match your private domains
regex_factory = RegexContextFactory(b"^(dev|test|stage)-api\.private.net")

RegexContextFactory 接受正则表达式(确保它是 bytes 类型)并忽略与正则表达式匹配的所有 TLS URL 的安全措施。所有其他 URL 以默认方式运行。

certificate = ssl.DefaultOpenSSLContextFactory('path\sample.key','path\sample.pem')

这不是证书。后来,有些东西试图像使用它一样使用它并得到一个属性错误,因为它没有像证书 would/should.

这样的 privateKey 属性

试试

with open("path/sample.key") as k:
    with open("path/sample.pem") as p:
        certificate = ssl.PrivateCertificate.loadPEM(k.read() + p.read())

相反。