Python Twisted Scrapy AttributeError: объект 'DefaultOpenSSLContextFactory' не имеет атрибута 'privateKey' - PullRequest
1 голос
/ 28 мая 2020

В этом коде я пытаюсь использовать файл сертификата .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,
                    })

Два файла существуют по указанному пути. Я попробовал команду fetch в Scrapy, и это был первый результат.

enter image description here

Однако после ввода парольной фразы PEM возникла эта ошибка? Как решить эту проблему?

enter image description here

Ответы [ 2 ]

1 голос
/ 29 мая 2020

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

Это не сертификат. Позже что-то пытается использовать его, как если бы он был, и выдает ошибку атрибута, потому что у него нет атрибута privateKey, как у сертификата.

Попробуйте что-то вроде

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

вместо этого.

0 голосов
/ 28 мая 2020

Это не совсем ответ на ваш вопрос, но слишком длинный для комментария. Мне проще НЕ иметь дело с одноразовыми сертификатами, такими как самоподписанные сертификаты или сертификаты для локальных / частных серверов. Я добился успеха с чем-то вроде этого (взято из проекта 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 тип) и игнорирует меры безопасности для всех URL-адресов TLS, соответствующих регулярному выражению. Все остальные URL-адреса работают по умолчанию.

...