2013-07-29 3 views
4

Я выдачи HTTPS GET запрос к службе REST у меня есть с httplib2 а, но мы получаем ошибку:версия SSL в httplib2 - EOF произошло в нарушение протокола

[Errno 8] _ssl.c:504: EOF occurred in violation of protocol 

Все остальные клиенты хорошо работает (браузер, клиент Java и т. д.) с небольшим исключением, что PHP curl необходимо настроить для использования SSL v3.

Я искал вокруг, и кажется, что это действительно ошибка в отношении версии SSL, но я не могу найти способ изменить ее в httplib2. Есть ли способ вокруг него, кроме изменения следующей строки в исходном коде:

# We should be specifying SSL version 3 or TLS v1, but the ssl module 
# doesn't expose the necessary knobs. So we need to go with the default 
# of SSLv23. 
return ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, 
         cert_reqs=cert_reqs, ca_certs=ca_certs) 
+0

Вы также исследовали приведенные ниже ссылки? : [SSL Ошибки для прокси-серверов] [1] [Python ошибки на стороне клиента SSL] [2] [1]: http://stackoverflow.com/questions/16883595/https- Прокси-запросы-errno-8-ssl-c504-eof-произошли в нарушении [2]: http://stackoverflow.com/questions/8247416/python-sslerror-client-side-erroreof -ccurred-in-wrong-of-protocol-serve –

+0

@PrahaladDeshpande Да, это не мое дело. Сервер находится в Scala (Jetty), и у меня нет прокси-сервера между клиентом и сервером. –

ответ

5

Я разработал этот обходной путь для httplib2:

import httplib2 

# Start of the workaround for SSL3 
# This is a monkey patch/module function overriding 
# to allow pages that only work with SSL3 

# Build the appropriate socket wrapper for ssl 
try: 
    import ssl # python 2.6 
    httplib2.ssl_SSLError = ssl.SSLError 
    def _ssl_wrap_socket(sock, key_file, cert_file, 
         disable_validation, ca_certs): 
     if disable_validation: 
      cert_reqs = ssl.CERT_NONE 
     else: 
      cert_reqs = ssl.CERT_REQUIRED 
     # Our fix for sites the only accepts SSL3 
     try: 
      # Trying SSLv3 first 
      tempsock = ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, 
             cert_reqs=cert_reqs, ca_certs=ca_certs, 
             ssl_version=ssl.PROTOCOL_SSLv3) 
     except ssl.SSLError, e: 
      tempsock = ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file, 
             cert_reqs=cert_reqs, ca_certs=ca_certs, 
             ssl_version=ssl.PROTOCOL_SSLv23) 
     return tempsock 
    httplib2._ssl_wrap_socket = _ssl_wrap_socket 
except (AttributeError, ImportError): 
    httplib2.ssl_SSLError = None 
    def _ssl_wrap_socket(sock, key_file, cert_file, 
         disable_validation, ca_certs): 
     if not disable_validation: 
      raise httplib2.CertificateValidationUnsupported(
        "SSL certificate validation is not supported without " 
        "the ssl module installed. To avoid this error, install " 
        "the ssl module, or explicity disable validation.") 
     ssl_sock = socket.ssl(sock, key_file, cert_file) 
     return httplib.FakeSocket(sock, ssl_sock) 
    httplib2._ssl_wrap_socket = _ssl_wrap_socket 

# End of the workaround for SSL3 

if __name__ == "__main__": 
    h1 = httplib2.Http() 
    resp, content = h1.request("YOUR_SSL3_ONLY_LINK_HERE", "GET") 
    print(content) 

Это решение было основано на обходные пути для urllib2, представленных на этом сообщении об ошибке http://bugs.python.org/issue11220,

Update: Представление решения для httplib2. Я не заметил, что вы используете httplib2, я думал, что это urllib2.

0

Пожалуйста, обратитесь к другим StackOverflow threads, которые определяют решение. Способ указания версии TLS заставляет версию SSL использовать TLSv1, как указано в ответе пользователя favoretti в указанной ссылке.

Будем надеяться, что это работает

Смежные вопросы