Eu tenho um pequeno aplicativo que escrevi em Python e ele funcionava ... até ontem, quando de repente começou a me dar um erro em uma conexão HTTPS. Não me lembro se houve uma atualização, mas tanto o Python 2.7.3rc2 quanto o Python 3.2 estão falhando da mesma forma.
Pesquisei no Google e descobri que isso acontece quando as pessoas estão atrás de um proxy, mas não estou (e nada mudou na minha rede desde a última vez que funcionou). O computador do meu syster executando o Windows e o Python 2.7.2 não tem problemas (na mesma rede).
>>> url = 'https://www.mediafire.com/api/user/get_session_token.php'
>>> response = urllib2.urlopen(url).read()
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:504: EOF occurred in violation of protocol>
O que há de errado? Qualquer ajuda é apreciada.
PS: As versões mais antigas de python também não funcionam, nem no meu sistema nem em uma sessão ao vivo a partir do USB, mas funcionam em uma sessão ao vivo no Ubuntu 11.10.
Respostas:
Isso parece estar relacionado à adição do suporte ao TLS 1.1 e 1.2 à versão do OpenSSL encontrada na 12.04. A falha de conexão pode ser reproduzida com a ferramenta de linha de comando OpenSSL:
A conexão terá êxito se forçar a conexão a usar o TLS 1.0 com o
-tls1
argumento da linha de comando.Eu sugiro que você envie um relatório de bug sobre esse problema aqui:
https://bugs.launchpad.net/ubuntu/+filebug
fonte
Para iniciantes em python como eu, aqui está a maneira de substituir o updplib da maneira mais fácil. Na parte superior do seu script python, inclua estas linhas:
A partir daqui, você pode usar o urllib ou o que quer que use como faria normalmente.
Nota: Isto é para python 2.7. Para uma solução python 3.x, você precisa substituir a classe HTTPSConnection encontrada em http.client. Deixo isso como um exercício para o leitor. :-)
fonte
httplib
. As pessoas podem usar outros soquetes SSL. Pode-se corrigirssl
como na minha resposta abaixo.BadStatusLine: ''
Você pode evitar modificar o arquivo httplib.py, modificando seu objeto HTTPSConnection:
O método de solicitação cria um novo soquete somente se connection.sock não estiver definido. Criar o seu próprio adicionando o parâmetro ssl_version fará com que o método de solicitação o use. Então tudo o resto funciona como de costume.
Eu estava tendo o mesmo problema e isso funciona para mim.
Saudações
fonte
O problema está
ssl
, ele não tem nada a ver com HTTP, então por que aplicar patcheshttplib
se você pode aplicar patchesssl
? O código a seguir deve corrigir todos os soquetes SSL, incluindo, mas não limitado a HTTPS, para Python 2.6+ (embutidossl
, não tentei compyopenssl
).fonte
EDITDATEPLIFIB.py (/usr/lib/pythonX.X/httplib.py no Linux)
Declaração de classe FIND HTTPSConnection
Código da classe interna da linha CHANGE
PARA
Em seguida, a solicitação HTTPS HTPLPS deve funcionar
fonte
Esse problema provavelmente ocorre porque o SSLv2 está desativado no servidor da Web, mas o Python 2.x tenta estabelecer uma conexão com o PROTOCOL_SSLv23 por padrão.
Aqui está o link para a minha resposta para um problema semelhante no Stack Overflow - /programming//a/24166498/41957
Atualização: é funcionalmente o mesmo que a resposta de @ temoto acima.
fonte
Uma correção simples que funcionou para mim foi substituir o protocolo padrão do SSL:
fonte