3

SSLv3 を必要とする HTTPS URL に SSLv3 を使用するように mechanize に強制するにはどうすればよいでしょうか? すべての SSLv3 専用 URL で mechanize を使用しようとすると、次のエラーが発生します。

URLError: <urlopen error [Errno 1] _ssl.c:504: error:140773E8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)>
4

3 に答える 3

1

Eiyrioü von Kauyf が上記で言及した Python の問題に関する最後のコメントは、mechanize の分岐バージョンで実装したソリューションです。mechanize/_opener.py の差分が続きます。mechanize.urlopen() を修正しますが、mechanize.Browser() の open() メソッドは修正しません。

diff --git a/mechanize/_opener.py b/mechanize/_opener.py
index ad8412d..e6d1ebc 100644
--- a/mechanize/_opener.py
+++ b/mechanize/_opener.py
@@ -25,9 +25,27 @@ import _rfc3986
 import _sockettimeout
 import _urllib2_fork
 from _util import isstringlike
+import ssl, socket

 open_file = open

+class HTTPSConnectionV3(httplib.HTTPSConnection):
+    def __init__(self, *args, **kwargs):
+        httplib.HTTPSConnection.__init__(self, *args, **kwargs)
+
+    def connect(self):
+        sock = socket.create_connection((self.host, self.port), self.timeout)
+        if self._tunnel_host:
+            self.sock = sock
+            self._tunnel()
+        try:
+            self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3)
+        except ssl.SSLError, e:
+            self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv23)
+
+class HTTPSHandlerV3(urllib2.HTTPSHandler):
+    def https_open(self, req):
+        return self.do_open(HTTPSConnectionV3, req)

 class ContentTooShortError(urllib2.URLError):
     def __init__(self, reason, result):
@@ -370,7 +388,7 @@ class OpenerFactory:
         _urllib2_fork.HTTPErrorProcessor,
         ]
     if hasattr(httplib, 'HTTPS'):
-        default_classes.append(_urllib2_fork.HTTPSHandler)
+        default_classes.append(HTTPSHandlerV3)
     handlers = []
     replacement_handlers = []
于 2013-10-09T19:53:43.687 に答える
0

TLSv1 を使用するために ssl.wrap_socket() にモンキー パッチを適用することができます。これは、Poodle の脆弱性の後、実行可能な唯一の方法であると思われます。これにより、上位レベルのライブラリに関係なく、すべての SSL 接続で強制的に TLSv1 が使用されます。

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)
于 2014-06-12T03:15:12.133 に答える