Potrzebuję użyć pliku certyfikatu klienta w formacie p12 (PKCS12), aby porozmawiać z serwerem za pomocą scrapy, czy jest jakiś sposób na zrobienie tego?Jak korzystać z certyfikatu klienta ssl (p12) ze Scrapy?
Odpowiedz
Nie mogę zaoferować tutaj przetestowanego i kompletnego rozwiązania, ale znam kilka miejsc, w których niektóre dostosowania mogą dać ci to, czego potrzebujesz.
Punktem wyjścia jest obiekt scrapy o numerze ContextFactory
definiujący konfigurację SSL/TLS. Standardowa implementacja ScrapyClientContextFactory
nie używa certyfikatów klienta, a także nie przeprowadza weryfikacji certyfikatu serwera, akceptuje tylko dowolny certyfikat. (More details)
Patrząc na source code jednak widać alternatywą BrowserLikeContextFactory
jest utworzenie obiektu optionsForClientTLS. Ten obiekt może również wymagać parametru clientCertificate
do uwierzytelnienia na serwerze. (Details)
więc teoretycznie trzeba podklasy BrowserLikeContextFactory
, napisz tam swój własny creatorForNetloc
sposób i uczynić go utworzyć optionsForClientTLS
które również mają clientCertificate
W GIST:
@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,
})
Aktywacja kontekstu fabryka w settings.py:
DOWNLOADER_CLIENTCONTEXTFACTORY = 'your.package.ClientCertContextFactory'
Według do docs twisted.internet.ssl.PrivateCertificate
może jedynie klawisze PEM obciążenie lub formacie ASN.1, si trzeba będzie przekształcić swój klucz w formacie PEM:
openssl pkcs12 -in client_ssl.pfx -out client_ssl.pem -clcerts
(zapożyczone z Converting pfx to pem using openssl)
aktualizacji konwersji plików pkcs12 w formacie p12:
openssl pkcs12 -in client_cert.p12 -out client_cert.pem -clcerts