【问题标题】:Python SSL via SNI Proxy通过 SNI 代理的 Python SSL
【发布时间】:2015-02-22 09:37:42
【问题描述】:

我在使用 Python 通过 SNI 代理服务器连接时遇到问题,以下代码 sn-p 显示了连接,执行脚本会导致不同的连接错误(握手、错误版本),具体取决于使用的 ssl 版本:

#!/usr/bin/python
import requests
import ssl
from requests.adapters import HTTPAdapter
try:
  from requests.packages.urllib3.poolmanager import PoolManager
except:
  from urllib3.poolmanager import PoolManager

class SSLAdapter(HTTPAdapter):
  def init_poolmanager(self, connections, maxsize, block=False):
    ssl_version=ssl.PROTOCOL_TLSv1
    #ssl_version=ssl.PROTOCOL_SSLv23
    #ssl_version=ssl.PROTOCOL_SSLv3
    assert_hostname = 'netflix.com'
    self.poolmanager = PoolManager(num_pools=connections,maxsize=maxsize,block=block,ssl_version=ssl_version,assert_hostname=assert_hostname)

def newSession():
  s = requests.Session()
  s.mount('https://', SSLAdapter())
  s.headers.update({'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.6 Safari/537.36'})
  return s

urlMain = "https://www.netflix.com"
session = None
session = newSession()
session.get(urlMain, verify=False).text

这会导致:

requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

从sniproxy服务器看日志,可以看到servername省略了None[];

2015-02-22 08:25:23 000.000.73.222:59288 -> 000.00.77.145:443 -> NONE [] 0/0 bytes tx 0/0 bytes rx 20.179 seconds

我怎样才能修改脚本,以便它发送服务器名称和请求?

【问题讨论】:

  • 你用的是哪个版本的python?我认为低于 2.7.9 的版本没有可用的 SNI。
  • 刚查到是2.7.6,你确定吗?

标签: python ssl sni


【解决方案1】:
pip install pyopenssl
pip install ndg-httpsclient
pip install pyasn1  

应该可以解决问题。连接到https://alice.sni.velox.ch 以验证 SNI 是否正常工作。
using requests with TLS doesn't give SNI support

【讨论】:

    【解决方案2】:

    我:你用的是哪个版本的python?我认为低于 2.7.9 的版本没有 SNI 可用。

    OP:刚刚检查是 2.7.6,你确定吗?

    是的,请参阅https://www.mnot.net/blog/2014/12/27/python_2_and_tls_sni。 这意味着您的问题是您使用的是没有 SNI 的 python 版本。因此,您要么需要升级 python 本身,要么升级它的一部分,如urllib3 on python 2.7 SNI error on Google App Engine 中所述。

    【讨论】:

    • 谢谢,但这不是我的代码,它是 xbmc (kodi) 中的一个插件模块。我似乎已经包含了他们自己的不支持 SNI 的 python 库!
    • @crankshaft 哪个插件?
    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2014-06-03
    • 1970-01-01
    • 2021-08-10
    • 2011-08-18
    相关资源
    最近更新 更多