Как использовать клиентский сертификат 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