【问题标题】:Scrapy unable to connect to HTTPS site that only supports older TLSv1. Connection LostScrapy 无法连接到仅支持旧 TLSv1 的 HTTPS 站点。连接丢失
【发布时间】:2019-04-05 20:56:31
【问题描述】:

使用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 的东西都会悄然消亡。

【问题讨论】:

    标签: ssl openssl scrapy twisted pyopenssl


    【解决方案1】:

    不是一个完整的答案; CW以防万一任何人都可以添加scrapy(或相关)部分。

    Man that server is bad! 它仅支持 SSL2 SSL3 和 TLS1.0,其中前两个已完全损坏,第一个已完全损坏上个世纪。它标识为可追溯到 Windows Server 2003 的 IIS/6.0——很久以前就已停产。

    FWLIW 它实际上不是版本不容忍的,或者超过 256 字节的 hello 中断,因为几年前就发现了一些有缺陷的实现;如果我使用 OpenSSL 1.0.2 向它发送 ClientHello 提供的 TLS1.2 密码仅限于 kRSA,它确实会正确协商到 TLS1.0。只有 OpenSSL>=1.0.2 default ClientHello 失败,它使用比以前版本大得多的密码列表,因为 TLS1.2 为新的 AEAD 格式和新的 PRF 方案添加了一大堆新密码套件.强制 TLS1.0 具有相同的效果,因为它会导致 OpenSSL 仅提供在 TLS1.0 中有效的较小的密码套件列表。 我隐约记得一个由“大型”密码列表触发的 XP 时代错误,这可能就是问题所在。

    这不是证书。证书是他们唯一拥有的权利

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多