Scrapy не удается подключиться к сайту HTTPS, который поддерживает только более старый TLSv1. Соединение потеряно

#ssl #openssl #scrapy #twisted #pyopenssl

#ssl #openssl #scrapy #twisted #pyopenssl

Вопрос:

Использование scrapy 1.6.0 (twisted 18.9.0, pyopenssl 19.0.0, openssl 1.0.2r, osx 10.14.3). Я исключил пользовательский агент и robots.txt . Похоже, проблема с согласованием сертификата. Веб-прокси не задействован.

Пункт назначенияhttps://www.labor.ny.gov /

Для воспроизведения:

 04:49:59 dork@Dorks-MacBook:~
0 $ scrapy shell
.
.
.
>>> fetch('https://www.labor.ny.gov')
2019-04-05 16:45:11 [scrapy.core.engine] INFO: Spider opened
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/dork/project/venv/lib/python3.6/site-packages/scrapy/shell.py", line 115, in fetch
    reactor, self._schedule, request, spider)
  File "/Users/dork/project/venv/lib/python3.6/site-packages/twisted/internet/threads.py", line 122, in blockingCallFromThread
    result.raiseException()
  File "/Users/dork/project/venv/lib/python3.6/site-packages/twisted/python/failure.py", line 467, in raiseException
    raise self.value.with_traceback(self.tb)
twisted.web._newclient.ResponseNeverReceived: [<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>]
  

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

 0 $ openssl version
OpenSSL 1.0.2r  26 Feb 2019
04:49:59 dork@Dorks-MacBook:~
0 $ openssl s_client -connect www.labor.ny.gov:443
CONNECTED(00000003)
4472571500:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 307 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1554497411
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
  

Однако, если я принудительно подключу openssl к TLSv1, это, похоже, сработает. Я просто не знаю, как заставить это из scrapy -> twisted -> pyopenssl -> OpenSSL или, если это возможно.

 04:49:59 dork@Dorks-MacBook:~
0 $ openssl s_client -tls1 -connect www.labor.ny.gov:443
CONNECTED(00000003)
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G2
verify return:1
depth=0 C = US, ST = New York, L = Albany, O = New York State Office for Technology, CN = labor.ny.gov
verify return:1
---
Certificate chain
 0 s:/C=US/ST=New York/L=Albany/O=New York State Office for Technology/CN=labor.ny.gov
   i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
 1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
.
.
.
  

Почтальон также не может получить страницу. Похоже, что все, что полагается на OpenSSL, как бы молча умирает.

Ответ №1:

Не полный ответ; CW на случай, если кто-нибудь может добавить scrapy (или связанную) часть.

Чувак, этот сервер плохой! Он поддерживает только SSL2, SSL3 и TLS1.0, где первые два полностью сломаны, а первый был полностью сломан в прошлом веке. Он идентифицируется как IIS / 6.0, который относится к Windows Server 2003, срок службы которого давно истек.

На самом деле он не является нетерпимым к версии или не работает для hello более 256 байт, поскольку несколько лет назад были обнаружены некоторые дефектные реализации; если я использую OpenSSL 1.0.2 для отправки его ClientHello, предлагающему TLS1.2 с шифрами, ограниченными kRSA, он корректно согласовывает до TLS1.0. Сбой происходит только для OpenSSL>=1.0.2 по умолчанию ClientHello, который использует значительно больший список шифров, чем предыдущие версии, потому что TLS1.2 добавил целую кучу новых ciphersuites для нового формата AEAD и новой схемы PRF. Принудительное использование TLS1.0 имеет тот же эффект, потому что это заставляет OpenSSL предлагать только меньший список ciphersuites, которые были действительны в TLS1.0. Я смутно вспоминаю ошибку эпохи XP, вызванную «большими» списками шифров, и это может быть проблемой здесь.

Это не сертификат. Сертификат — это единственное, на что у них есть право.