Как использовать клиентский сертификат ssl (p12) с Scrapy?

Мне нужно использовать файл сертификата клиента в формате p12(PKCS12), чтобы поговорить с веб-сервером с разборкой, есть ли способ сделать это?

1 ответ

Решение

Я не могу предложить вам проверенное и полное решение здесь, но я знаю несколько мест, где некоторые настройки могут дать вам то, что вам нужно.

Отправной точкой является скрапы ContextFactory объект, который определяет конфигурацию SSL/TLS. Стандартная реализация ScrapyClientContextFactory не использует клиентские сертификаты, а также не выполняет никакой проверки сертификата сервера, он просто принимает любой сертификат. ( Подробнее)

При просмотре исходного кода, однако, вы видите альтернативу BrowserLikeContextFactory создает optionsForClientTLS объект.

Этот объект также может занять clientCertificate параметр для аутентификации на сервере. ( Подробности)

Так что в теории вам нужно подкласс 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

(Заимствовано из преобразования pfx в pem с использованием openssl)

Обновление преобразования для файлов PKCS12 в формате p12:

openssl pkcs12 -in client_cert.p12 -out client_cert.pem -clcerts
Другие вопросы по тегам