使用urllib下载HTTPS页面,错误:14077438:SSL例程:SSL23_GET_SERVER_HELLO:tlsv1 alert内部错误

yak*_*yak 5 python ssl python-2.7

我用最新KubuntuPython 2.7.6.我尝试https使用以下代码下载页面:

import urllib2

hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'pl-PL,pl;q=0.8',
       'Connection': 'keep-alive'}

req = urllib2.Request(main_page_url, headers=hdr)

try:
    page = urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.fp.read()

content = page.read()
print content
Run Code Online (Sandbox Code Playgroud)

但是,我收到这样的错误:

Traceback (most recent call last):
  File "test.py", line 33, in <module>
    page = urllib2.urlopen(req)
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 404, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 422, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1222, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1184, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 1] _ssl.c:510: error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error>
Run Code Online (Sandbox Code Playgroud)

怎么解决这个?

解决了!

我使用了@SteffenUllrich给出的网址https://www.ssllabs.com.原来,服务器使用TLS 1.2,所以我将python更新为2.7.10并将我的代码修改为:

import ssl
import urllib2

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)

hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'pl-PL,pl;q=0.8',
       'Connection': 'keep-alive'}

req = urllib2.Request(main_page_url, headers=hdr)

try:
    page = urllib2.urlopen(req,context=context)
except urllib2.HTTPError, e:
    print e.fp.read()

content = page.read()
print content
Run Code Online (Sandbox Code Playgroud)

现在它下载页面.

Ste*_*ich 5

我使用最新的Kubuntu与Python 2.7.6

据我所知,最新的Kubuntu(15.10)使用2.7.10.但假设您使用的是包含在14.04 LTS中的2.7.6:

也适用于我的Facebook,所以它可能是页面问题.现在怎么办?

那取决于网站.此版本的Python的典型问题是缺少对仅添加到Python 2.7.9的服务器名称指示(SNI)的支持.由于今天很多网站都需要SNI(就像使用Cloudflare Free SSL的所有网站一样),我想这就是问题所在.

但是,还有其他可能性,例如多个信任路径,只能通过OpenSSL 1.0.2修复.或者只是缺少中间证书等.只有在您提供URL或根据此信息和SSLLabs分析自己分析情况时,才可能提供更多信息和解决方法.