Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Urllib.urlopen()在一台计算机上使用Python2.6.6处理SSLv3 URL,但在另一台计算机上不使用Python2.6.7/2.7.2_Python_Ssl_Https_Urllib_Urlopen - Fatal编程技术网

Urllib.urlopen()在一台计算机上使用Python2.6.6处理SSLv3 URL,但在另一台计算机上不使用Python2.6.7/2.7.2

Urllib.urlopen()在一台计算机上使用Python2.6.6处理SSLv3 URL,但在另一台计算机上不使用Python2.6.7/2.7.2,python,ssl,https,urllib,urlopen,Python,Ssl,Https,Urllib,Urlopen,在这件事上花了一天的大部分时间,我真是束手无策。我安装了一台安装了Python2.6.6/2.7.2的机器“A”,另一台安装了Python2.6.7/2.7.2的机器“B” 在机器A上,我可以用urllib2.urlopen>获得一个SSLv3加密的网站https://fed.princeton.edu)使用Python 2.6.6而不是2.7.2 在机器B上,我无法使用任何一个Python版本获得该网站 我的意思是,我得到了错误: Traceback: File "/usr/local/lib

在这件事上花了一天的大部分时间,我真是束手无策。我安装了一台安装了Python2.6.6/2.7.2的机器“A”,另一台安装了Python2.6.7/2.7.2的机器“B”

在机器A上,我可以用
urllib2.urlopen>获得一个SSLv3加密的网站https://fed.princeton.edu)
使用Python 2.6.6而不是2.7.2

在机器B上,我无法使用任何一个Python版本获得该网站

我的意思是,我得到了错误:

Traceback:
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django_cas-2.0.3-py2.7.egg/django_cas/views.py" in login
  78.         user = auth.authenticate(ticket=ticket, service=service)
File "/usr/local/lib/python2.7/dist-packages/Django-1.3.1-py2.7.egg/django/contrib/auth/__init__.py" in authenticate
  55.             user = backend.authenticate(**credentials)
File "/usr/local/lib/python2.7/dist-packages/django_cas-2.0.3-py2.7.egg/django_cas/backends.py" in authenticate
  72.         username = _verify(ticket, service)
File "/usr/local/lib/python2.7/dist-packages/django_cas-2.0.3-py2.7.egg/django_cas/backends.py" in _verify_cas2
  46.     page = urlopen(url)
File "/usr/lib/python2.7/urllib.py" in urlopen
  84.         return opener.open(url)
File "/usr/lib/python2.7/urllib.py" in open
  205.                 return getattr(self, name)(url)
File "/usr/lib/python2.7/urllib.py" in open_https
  435.             h.endheaders(data)
File "/usr/lib/python2.7/httplib.py" in endheaders
  954.         self._send_output(message_body)
File "/usr/lib/python2.7/httplib.py" in _send_output
  814.         self.send(msg)
File "/usr/lib/python2.7/httplib.py" in send
  776.                 self.connect()
File "/usr/lib/python2.7/httplib.py" in connect
  1161.             self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
File "/usr/lib/python2.7/ssl.py" in wrap_socket
  372.                      ciphers=ciphers)
File "/usr/lib/python2.7/ssl.py" in __init__
  134.                 self.do_handshake()
File "/usr/lib/python2.7/ssl.py" in do_handshake
  296.         self._sslobj.do_handshake()

Exception Type: IOError at /login
Exception Value: [Errno socket error] [Errno 1] _ssl.c:503: error:140773F2:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert unexpected message
首先,我感到困惑的是,在较早的Python版本上工作的东西在稍后的机器A上不起作用。我还非常困惑的是,在2.6.6上工作的东西在2.6.7上不起作用(尽管在不同的机器上)。为什么会这样

现在我不确定Python的配置在这两者上是否完全相同,但是
import\u ssl
import httplib;httplib.HTTPSConnection
适用于两台计算机上的所有版本。我还尝试了
curl-vhttps://fed.princeton.edu
openssl-fed.princeton.edu:https
在这两台机器上,这些命令都可以工作

我也做了一些研究,发现作者似乎已经放弃了用urllib代替libCurl(我宁愿不要,因为我使用的是django cas,它使用urllib,我不想过多地修改代码)



注意:我刚刚发现,上一篇文章的解决方案允许我使用urlopen打开网站。但是我如何使用他们的解决方案(似乎是使用
urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3())
?)来解析django cas中的my urlopen()。

经过一点实验后,我刚刚接受了Python 2.6.6是可以的,但是2.6.7+有一个错误,就是无法通过
urllib.urlopen()
获取SSLv3加密页面


我通过简单地使用
urllib2.install\u opener
技巧解决了我的问题,并修改了django\u cas,以便在任何
urlopen()
调用之前安装此opener。

您可以通过覆盖ssl\u version关键字参数来对ssl.wrap\u socket()进行修补。以下代码可以按原样使用。将其置于urlopen()之前


编辑:在意识到functools.partial实际上不返回函数后,我更新了上面的代码,在这种情况下不适用。尽管看起来很简单,但以上代码仍然是我所知道的最好的解决方案。

这两个系统上有不同版本的OpenSSL吗?
import ssl
from functools import wraps
def sslwrap(func):
    @wraps(func)
    def bar(*args, **kw):
        kw['ssl_version'] = ssl.PROTOCOL_TLSv1
        return func(*args, **kw)
    return bar

ssl.wrap_socket = sslwrap(ssl.wrap_socket)