From 3384db92b4fb2bce66d01ddf5365478a695caad6 Mon Sep 17 00:00:00 2001 From: Andrey Rakhmatullin Date: Thu, 27 Sep 2018 19:51:27 +0500 Subject: [PATCH] Add support for setting SSL ciphers. --- scrapy/core/downloader/contextfactory.py | 13 +++++++++---- scrapy/settings/default_settings.py | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/scrapy/core/downloader/contextfactory.py b/scrapy/core/downloader/contextfactory.py index 127a246f5..89d2776ae 100644 --- a/scrapy/core/downloader/contextfactory.py +++ b/scrapy/core/downloader/contextfactory.py @@ -1,5 +1,5 @@ from OpenSSL import SSL -from twisted.internet.ssl import optionsForClientTLS, CertificateOptions, platformTrust +from twisted.internet.ssl import optionsForClientTLS, CertificateOptions, platformTrust, AcceptableCiphers from twisted.web.client import BrowserLikePolicyForHTTPS from twisted.web.iweb import IPolicyForHTTPS from zope.interface.declarations import implementer @@ -19,15 +19,20 @@ class ScrapyClientContextFactory(BrowserLikePolicyForHTTPS): understand the SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols.' """ - def __init__(self, method=SSL.SSLv23_METHOD, tls_verbose_logging=False, *args, **kwargs): + def __init__(self, method=SSL.SSLv23_METHOD, tls_verbose_logging=False, tls_ciphers=None, *args, **kwargs): super(ScrapyClientContextFactory, self).__init__(*args, **kwargs) self._ssl_method = method self.tls_verbose_logging = tls_verbose_logging + if tls_ciphers: + self.tls_ciphers = AcceptableCiphers.fromOpenSSLCipherString(tls_ciphers) + else: + self.tls_ciphers = DEFAULT_CIPHERS @classmethod def from_settings(cls, settings, method=SSL.SSLv23_METHOD, *args, **kwargs): tls_verbose_logging = settings.getbool('DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING') - return cls(method=method, tls_verbose_logging=tls_verbose_logging, *args, **kwargs) + tls_ciphers = settings['DOWNLOADER_CLIENT_TLS_CIPHERS'] + return cls(method=method, tls_verbose_logging=tls_verbose_logging, tls_ciphers=tls_ciphers, *args, **kwargs) def getCertificateOptions(self): # setting verify=True will require you to provide CAs @@ -45,7 +50,7 @@ class ScrapyClientContextFactory(BrowserLikePolicyForHTTPS): method=getattr(self, 'method', getattr(self, '_ssl_method', None)), fixBrokenPeers=True, - acceptableCiphers=DEFAULT_CIPHERS) + acceptableCiphers=self.tls_ciphers) # kept for old-style HTTP/1.0 downloader context twisted calls, # e.g. connectSSL() diff --git a/scrapy/settings/default_settings.py b/scrapy/settings/default_settings.py index 81fee543f..742c8e8a1 100644 --- a/scrapy/settings/default_settings.py +++ b/scrapy/settings/default_settings.py @@ -85,6 +85,7 @@ DOWNLOADER = 'scrapy.core.downloader.Downloader' DOWNLOADER_HTTPCLIENTFACTORY = 'scrapy.core.downloader.webclient.ScrapyHTTPClientFactory' DOWNLOADER_CLIENTCONTEXTFACTORY = 'scrapy.core.downloader.contextfactory.ScrapyClientContextFactory' +DOWNLOADER_CLIENT_TLS_CIPHERS = 'DEFAULT' DOWNLOADER_CLIENT_TLS_METHOD = 'TLS' # Use highest TLS/SSL protocol version supported by the platform, # also allowing negotiation DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING = False