Relacionado ao #1083, talvez. O padrão requests.get()
para este site/página em particular https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html
resulta em:
>>> import requests
>>> requests.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Usando request-toolbelt
de SSLAdapter
para tentar várias versões ssl, todas elas falham, ao que parece... veja os seguintes rastreamentos.
TLSv1:
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv3:
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
Observe que o último fornece um erro Connection reset by peer
, que difere dos outros, mas tenho certeza de que o SSLv2 não é suportado pelo servidor de qualquer maneira.
Por diversão, tentei passar por alguns cabeçalhos mais apropriados na última solicitação também:
>>> headers = {
... 'Accept': u"text/html,application/xhtml+xml,application/xml",
... 'User-Agent': u"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36",
... 'Accept-Encoding': u"gzip,deflate",
... 'Accept-Language': u"en-US,en;q=0.8"
... }
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html', headers=headers)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
Nenhum dado lá também. Veja como são as informações de conexão HTTPS no Chrome no Mac:
Não tenho certeza, mas algumas pesquisas no Google indicam que é provável que seja um problema de lista de cifras, que é mais urllib3, eu acho?
Tentei modificar DEFAULT_CIPHER_LIST
em pyopenssl
, mas comecei a ter erros de importação. Neste ponto, parecia que as coisas estavam quebradas, e não havia realmente uma maneira adequada de abordar a correção disso ainda.
Versão informação:
OSX Mavericks
Python 2.7.5
OpenSSL 0.9.8y 5 de fevereiro de 2013 - (de python -c "import ssl; print ssl.OPENSSL_VERSION"
)
solicitações 2.2.1
request-toolbelt 0.2.0
urllib3 1,8
Infelizmente, isso não está relacionado ao problema que você identificou, e inteiramente ao OpenSSL de baixa qualidade que o OS X vem com por padrão. A versão 0.9.8y tem alguns problemas reais com a execução de handshakes SSL, e alguns servidores não o toleram bem. Usar o Python 3 na minha caixa OS X (portanto, usando um OpenSSL mais recente) revela que não há problema.
Você tem duas opções:
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
.Ah, parece que eu estava seguindo um arenque vermelho - não pretendo implantar nada no OSX de qualquer maneira. Parece que vou mover meus testes para uma caixa virtual linux. Desculpas por este assunto prolixo!
Não há necessidade de se desculpar, fazer essa pergunta foi a coisa certa a fazer: é um conhecimento bizarramente específico saber que o OS X tem esse problema. =)
Ok, isso é uma chatice. Eu criei uma imagem do Virtualbox de 32 bits do servidor Ubuntu 14.04 via Vagrant e tudo isso ainda está acontecendo, exceto no caso SSLv2, onde falha porque o protocolo não está incluído na versão OpenSSL no Ubuntu 14.04 (por design, acredito - SSLv2 é antigo e desatualizado).
Versões:
Ubuntu 14.04 32 bits (via combinação Vagrant/Virtualbox)
Python 2.7.6
solicitações==2.2.1
request-toolbelt==0.2.0
urllib3==1.8.2
EDIT: esqueci a versão do OpenSSL...
python -c "importar ssl; imprimir ssl.OPENSSL_VERSION"
OpenSSL 1.0.1 de 6 de janeiro de 2014
TLSv1:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv23:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv23')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Talvez este seja um problema de lista de cifras então? Ou a versão OpenSSL usada aqui ainda é problemática?
Estou absolutamente disposto a dedicar algum tempo para ajudar a depurar isso, se necessário... desde que vocês me deem alguma orientação.
A VM está baixando. Não consigo reproduzir isso no ArchLinux.
Os stacktraces indicam isso, mas gostaria de ter certeza: você _não_ está usando PyOpenSSL, mas apenas o stdlib?
@ t-8ch Obrigado por dar uma olhada nisso, estou um pouco confuso. OpenSSL torna minha vida muito difícil =(
@ t-8ch Eu não instalei o PyOpenSSL se é isso que você está perguntando?
Eu teria assumido (talvez incorretamente) que pip install requests
deveria me dar tudo que eu preciso para chamar requests.get('...')
com sucesso em uma página HTTPS. O que, é claro, funciona na maior parte, mas não para este site por algum motivo.
@jaddison _principalmente_ sim. Infelizmente, a biblioteca padrão do Python 2.7 é uma droga e não suporta alguns recursos, como o SNI.
Gostaria de saber se isso é SNI...
@jaddison Existem dois caminhos de código diferentes nos bastidores. Você não deveria se preocupar com isso, mas ajuda saber ao depurar.
No entanto, agora posso reproduzir isso no Ubuntu. Mas apenas o Py2. No Py3 está tudo bem.
Eu suspeito que @Lukasa está certo e o servidor falha quando o cliente não está usando o SNI.
Incomoda-me que a ausência de SNI falhe de várias maneiras diferentes, dependendo do servidor em questão.
Eu notei essa mudança entre o OpenSSL 1.0.1f e 1.0.1g (https://www.openssl.org/news/openssl-1.0.1-notes.html):
Add TLS padding extension workaround for broken servers.
EDIT: Ahh, esqueça - o bug não deve variar entre Py 2 e 3, eu acho.
@jaddison Para testar se isso é SNI, você precisará instalar os requisitos de SNI para Python 2.
@Lucasa estava certo. Comparar:
$ openssl s_client -connect docs.apitools.com:443
CONNECTED(00000003)
139846853338768:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:762:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 517 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$ openssl s_client -connect docs.apitools.com:443 -servername docs.apitools.com
... happy handshake here
Para elaborar: O segundo comando habilita a funcionalidade SNI de openssl s_client
.
Você pode a) mudar para python3 b) instalar dependências extras.
O stdlib no momento não tem como fazer SNI.
Obrigado pelo feedback rápido. Já que não tem bug, vou fechar... de novo.
Oi, obrigado pessoal!! Instalei o python3 no meu mac e boom, funciona.
Só quero entrar em contato e dizer que experimentei esse problema no OS X 10.9.5, Python 2.7.7 e OpenSSL 0.9.8zc.
Consegui resolver meu problema de handshake:
brew install OpenSSL
cryptography
vinculado ao novo OpenSSL ( env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install cryptography
)pip install requests[security]
Obrigado, @Microsserf. Estou praticamente executando as mesmas especificações (10.9.5, Python 2.7.6 instalado via Homebrew, mas compilado com o sistema fornecido OpenSSL 0.9.8zg) e este foi todo o meu processo para obter requests
em funcionamento para o Django :
brew install openssl
Instale requests
com um monte de coisas SNI , compiladas em nossa nova instalação do OpenSSL. A opção [security]
simplesmente instala pyopenssl ndg-httpsclient pyasn1
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install requests[security] urllib3
E estamos prontos:
"""
This may or may not be needed. See:
https://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl
"""
# from urllib3.contrib import pyopenssl
# pyopenssl.inject_into_urllib3()
import requests
# r = requests.get(...)
Existe uma resposta definitiva sobre como fazer isso funcionar no Ubuntu? Estou enfrentando esse problema e parece que a única resposta aqui diz respeito a como fazer isso funcionar em um Mac. Atualizar toda a nossa base de código para python 3 não é uma opção.
OK, eu posso ter acabado de responder minha própria pergunta. O que eu fiz se resume a:
sudo apt-get install libffi-dev
pip install pyOpenSSL ndg-httpsclient pyasn1
@lsemel obrigado, isso me economizou muito tempo
@lsemel Tem certeza? Eu tentei no Ubuntu 15.10 e ainda não funciona com o Python 2.7.10.
Funciona com Python 2.7 no Travis CI:
https://travis-ci.org/playing-se/swish-python
Deu pra funcionar agora! Eu simplesmente desinstalei o pyOpenSSL:
pip uninstall pyOpenSSL
Talvez devêssemos apenas pyopenssl.inject_into_urllib3() se a versão do Python for menor que 2.7.9? pyOpenSSL parece quebrar coisas no Ubuntu e no Windows se a versão do Python for 2.7.10.
PyOpenSSL não deve estar quebrando nada. Se isso acontecer, isso é um bug que deve ser relatado.
Vou ter que olhar para isso, mas existe algum bom motivo para injetar pyopenssl em urllib3 se a versão do Python for 2.7.9 ou mais recente?
Estou pensando em algo assim:
# Check if Modern SSL with SNI support
try:
from ssl import SSLContext
from ssl import HAS_SNI
except ImportError:
# Attempt to enable urllib3's SNI support, if possible
try:
from .packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3()
except ImportError:
pass
Sim, frequentemente há. Por exemplo, no OS X, a maioria dos Pythons vincula-se ao sistema OpenSSL, que é a versão 0.9.8zg. O PyOpenSSL, no entanto, será vinculado a um OpenSSL muito mais recente (1.0.2). Isso torna o uso do PyOpenSSL uma melhoria substancial de segurança.
Além disso, o PyOpenSSL nos dá um acesso muito melhor ao OpenSSL, permitindo protegê-lo de forma mais eficaz.
OK, eu brinquei um pouco com isso agora.
FUNCIONA com pyopenssl MAS não se ndg-httpsclient estiver instalado.
No entanto, posso fazê-lo funcionar com ndg-httpsclient se eu desinstalar o pyasn1 me dando estes avisos:
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/ssl_peer_verification.py:25: UserWarning: SubjectAltName support is disabled - check pyasn1 package installation to enable
warnings.warn(SUBJ_ALT_NAME_SUPPORT_MSG)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
Mesmo comportamento no Ubuntu 15.10 e Windows 10 com o Python 2.7.10 instalado.
Isso porque sem o ndg-httpsclient o suporte ao PyOpenSSL não é usado.
Sim, terei que investigar por que funciona se SubjectAltName estiver desabilitado. Qualquer ideia?
Quase certamente o problema é que você está usando OpenSSLs diferentes em cada caso.
Eu tive o mesmo problema na minha caixa Ubuntu 14.04 e Python 2.7.11
é do SNI
O que funcionou para mim foi isso:
Acho que houve uma verificação de tempo de instalação no urllib3 ou solicitações que impediram que as coisas funcionassem sem a desinstalação
@jvanasco o que você está usando para instalar esses pacotes? Eu suponho pip. Por que você está instalando o urllib3 e os pedidos separadamente?
Bem, eu precisava do urllib3 no virtualenv... mas instalei-o para tentar obter os requisitos instalados por pip e easy_install. (usei os dois)
Eu tenho um indexador da web e alguns URLs quebrados. Eu escrevi um script rápido para tentar os quebrados e continuei reinstalando/excluindo+instalando os pacotes nas instruções urllib3 sobre problemas de SSL até que eles funcionassem.
Em 31 de maio de 2016, às 19h25, Ian Cordasco [email protected] escreveu:
@jvanasco o que você está usando para instalar esses pacotes? Eu suponho pip. Por que você está instalando o urllib3 e os pedidos separadamente?
—
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou silencie a conversa.
Ainda estou vendo esse problema e tentei as soluções sugeridas.
Atualizei minha versão python para 2.7.11
Instalei os 3 pacotes adicionais.
Eu tentei a sequência de desinstalação/instalação que @jvanasco sugeriu e ainda recebi o SSLError
Também usando o Ubuntu 14.04, infelizmente, não há atualização do OpenSSL, então tenho que usar as soluções alternativas postadas aqui e não estou tendo sorte.
Algum passo extra que vocês possivelmente tomaram?
Obrigado
@Lekinho Achei que fazer um pequeno script de teste que testou o domínio com o qual eu estava tendo problemas ajudou.
foi só:
import requests
r = requests.get(bad_url)
print r.__dict__
@Lekinho Você pode extrair pyopenssl de solicitações em seu código:
try:
from requests.packages.urllib3.contrib import pyopenssl
pyopenssl.extract_from_urllib3()
except ImportError:
pass
@Lekinho Se você ainda estiver encontrando esse problema com o Python 2.7.11, é altamente provável que o servidor remoto não suporte as configurações de TLS usadas pelas solicitações. O servidor em questão está disponível na internet pública? Se sim, pode me fornecer a URL?
eu tentei a importação pyopenssl como sugerido.
Infelizmente, isso não é acessível publicamente.
No entanto, tenho os detalhes exatos de qual versão do openSSL o servidor possui.
Basicamente, rodamos em uma máquina virtual redhat, eu tinha esse openSSL quando tudo estava funcionando: openssl-1.0.1e-42.el6_7.4.x86_64
Então fizemos uma atualização do redhat e houve uma atualização para openssl : openssl-1.0.1e-48.el6_8.1.x86_64
Esta versão sempre tem o problema de handshake ruim ao usar openssl no Ubuntu 14.04.
Vocês têm alguma URL pública que eu possa tentar, para ver se as soluções alternativas ajudaram a resolver o problema e é apenas essa combinação única que eu tenho que é o problema?
A mesma máquina está bem quando as solicitações REST são enviadas pelo navegador (ou seja, sem o ubuntu openssl )
Obrigado
Você pode fornecer a saída de rpm -q --changelog openssl
, por favor?
[ admin@leke-2-2-8-11 ~]$ rpm -q --changelog openssl
Parece que @Lekinho excluiu sua conta do github? Para a próxima pessoa que tiver problemas - é possível que a atualização do OpenSsl ou do Python tenha quebrado algumas ligações c compiladas. Sempre que tenho uma atualização como essa, destruo meu virtualenv ou todos os pacotes e construo um novo.
@jvanasco ainda estou aqui.
Eu queria saber, você tem um URL público que eu possa testar isso? Quero ver se a solução alternativa realmente resolve o problema para casos confirmados (isso significa que não estraguei nada ao tentar fazê-lo)
@Lukasa
subconjunto de changeset entre a versão de trabalho e a versão atualizada :+1:
Seg, 02 de maio de 2016 Tomáš Mráz [email protected] 1.0.1e-48.1
correção CVE-2016-2105 - possível estouro na codificação base64
correção CVE-2016-2106 - possível estouro em EVP_EncryptUpdate()
correção CVE-2016-2107 - oráculo de preenchimento em AES-NI CBC-MAC costurado
correção CVE-2016-2108 - corrupção de memória no codificador ASN.1
correção CVE-2016-2109 - possível DoS ao ler dados ASN.1 da BIO
corrigir CVE-2016-0799 - problemas de memória em BIO_printf
Quarta-feira, 24 de fevereiro de 2016 Tomáš Mráz [email protected] 1.0.1e-48
correção CVE-2016-0702 - ataque de canal lateral na exponenciação modular
correção CVE-2016-0705 - double free na análise de chave privada DSA
corrigir CVE-2016-0797 - corrupção de heap em BN_hex2bn e BN_dec2bn
Ter, 16 de fevereiro de 2016 Tomáš Mráz [email protected] 1.0.1e-47
correção CVE-2015-3197 - Aplicação do conjunto de criptografia SSLv2
desabilitar SSLv2 no método TLS genérico
Sex 15 de janeiro de 2016 Tomáš Mráz [email protected] 1.0.1e-46
corrigir vazamento de memória de 1 byte na análise pkcs12 (#1229871)
documente algumas opções do comando de velocidade (#1197095)
Qui, 14 de janeiro de 2016 Tomáš Mráz [email protected] 1.0.1e-45
corrigir carimbos de data/hora de alta precisão na autoridade de carimbo de data/hora
Seg, 21 de dezembro de 2015 Tomáš Mráz [email protected] 1.0.1e-44
correção CVE-2015-7575 - não permite o uso de MD5 em TLS1.2
Sex 04 de dezembro de 2015 Tomáš Mráz [email protected] 1.0.1e-43
correção CVE-2015-3194 - falha de verificação de certificado com parâmetro PSS ausente
corrigir CVE-2015-3195 - vazamento de memória X509_ATTRIBUTE
corrigir CVE-2015-3196 - condição de corrida ao lidar com a dica de identidade PSK
Ter, 23 de junho de 2015 Tomáš Mráz [email protected] 1.0.1e-42
Atualizar :
Então eu encontrei um trabalho em torno disso.
Basicamente, um colega estava lendo sobre o assunto e viu alguns posts sobre o suporte do RHEL openssl para a cifra ECC/ECDH não ser 100% por qualquer motivo.
Tentamos a solicitação para a URL desabilitando explicitamente as cifras ECDH (adicionando a negação do próprio script openssl, ou seja, openssl s_client -connect 10.85.103.218:8443 -cipher 'DEFAULT:!ECDH')
Conseguimos conectar com sucesso.
Aqui está a lista de cifras padrão para o openssl no Ubuntu 14.04
ECDH+ AESGCM:DH+AESGCM :ECDH+AES256:DH+AES256:ECDH+AES128:DH+ AES:ECDH+HIGH :DH+ HIGH:ECDH+3DES :DH+3 DES:RSA+AESGCM :RSA+ AES:RSA+HIGH :RSA +3DES:!aNULL:!eNULL:!MD5
Então, com esse conhecimento, usei pyopenssl para imprimir minhas cifras SSL padrão e removi explicitamente todas as cifras ECDH da string. Fiz isso certo no bloco para importar urllib3 do pacote de solicitações (ou seja, antes de começar a fazer qualquer solicitação real) aqui está algo semelhante:
https://github.com/kennethreitz/requests/issues/1308
Eu percebo que pode haver riscos de segurança para esta ação, mas pelo menos isso nos ajuda e lança mais luz sobre isso.
Por que essas cifras específicas parecem ser um problema para o RHEL, não faço ideia.
Vou tentar quando tiver mais tempo para ver quais alterações específicas do RHEL podem ter introduzido isso e ler mais sobre o objetivo.
Alguém sabe mais sobre cifras em geral?
Tem o mesmo problema... ARG...
A frustração do @lukas-gitl não o ajudará a resolver o problema. Fornecer-nos informações sobre o seu ambiente (de preferência algumas - se não todas - as informações que pedimos ao Lekinho acima) ajudará.
@sigmavirus24 Desculpas. Eu pretendia fornecer mais informações e, em seguida, fui rastreado (já que não tinha tempo para isso). Estou usando o Ubuntu 14.04, python 2.7.6 e a versão de solicitações mais recente no pip. Isso acontece quando tento acessar como endpoint do API Gateway (eles podem ser bastante restritivos).
Eu tentei remover o virtualenv e regenerá-lo, mas infelizmente isso não resolveu.
Deixe-me saber o que mais você precisa. Mudei para nodejs por enquanto, mas ficaria feliz em ajudar com uma resolução.
@lukas-gitl É altamente provável que o servidor que você está contatando exija cifras que você não está oferecendo ou versões TLS que você não está oferecendo. Isso pode estar relacionado ao OpenSSL que você instalou. Você também deve tentar executar pip install requests[security]
: você pode estar encontrando problemas com o SNI.
Sim, eu já tentei isso também. Deixe-me montar um script de teste rápido aqui para que estejamos na mesma página.
virtualenv -p /usr/bin/python2.7 env
fonte env/bin/ativar
solicitações de instalação do pip
solicitações de instalação do pip[segurança]
echo 'solicitações de importação' >> test.py
echo 'requests.get("https://API_ID.execute-api.us-west-2.amazonaws.com/ENV/ENPOINT")' >> test.py
python teste.py
E qual erro específico você está vendo?
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:318:
SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
SNIMissingWarning
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Traceback (most recent call last):
File "test.py", line 2, in <module>
requests.get("https://sbsz8eqowe.execute-api.us-west-2.amazonaws.com/dev/segment_to_s3_webhook")
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure```
Então, basicamente, sou obrigado a atualizar para uma versão posterior do python?
Ok, ambos os avisos sugerem que suas solicitações não estão realmente usando as extensões de requests[security]. Ele sugere fortemente que qualquer Python que você esteja executando é _não_ aquele que você instalou em seu ambiente virtual: a extensão requests[security] deve remover esses avisos.
@lukas-gitl, por favor, veja minhas notas acima.
Você tem acesso ao servidor? compare a lista de cifras padrão para o servidor e o cliente.
É altamente provável que um deles não suporte o primeiro conjunto de cifras no outro, daí o erro.
Você pode verificar as cifras padrão com um script simples como o que usei aqui:
sistema de importação
importar SO
importar ssl
print(ssl.OPENSSL_VERSION)
sys.path.insert(1, os.path.abspath(os.path.join(os.getcwd(), 'lib'))))
sys.path.append('/usr/local/lib/python2.7/dist-packages')
solicitações de importação
de requests.packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3()
imprimir pyopenssl.DEFAULT_SSL_CIPHER_LIST
Ok, agora estou realmente confuso. A mensagem de erro está vindo do ambiente virtual. Então, como eles podem vir de lá enquanto eu executo a partir de um ambiente python diferente?
Então eu tentei pip install pyopenssl ndg-httpsclient pyasn1
em vez de pip install requests[security]
e funcionou...
Aha, eu suspeito que seu pip é muito velho para lidar com os extras.
Ah, droga. Isso explica muito. Muito obrigado pela sua ajuda!
Eu encontrei o mesmo problema aqui, eu deveria enviar uma solicitação GET seguindo o código:
requests.get('https://mdskip.taobao.com/core/initItemDetail.htm?itemId=530444505608&showShopProm=false&queryMemberRight=true&isRegionLevel=false&tmallBuySupport=true&addressLevel=2&sellerPreview=false&isForbidBuyItem=false&cachedTimestamp=1466835924196&offlineShop=false&household=false&tryBeforeBuy=false&isSecKill=false&service3C=false&isApparel=true&isUseInventoryCenter=false&cartEnable=true&isAreaSell=false&callback=setMdskip×tamp=1466841669969&isg=Al9faN3XWRpIf6UEoQ88UH/1b7np0rNm&ref=https%3A%2F%2Fs.taobao.com%2Fsearch%3Fq%3D%25E6%258B%2589%25E5%25A4%258F%25E8%25B4%259D%25E5%25B0%2594%26imgfile%3D%26commend%3Dall%26ssid%3Ds5-e%26search_type%3Ditem%26sourceId%3Dtb.index%26spm%3Da21bo.50862.201856-taobao-item.1%26ie%3Dutf8%26initiative_id%3Dtbindexz_20160625')
infelizmente, recebi as informações do erro:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
Eu tentei brew install openssl, brew upgrade openssl, pip install --upgrade pip, pip install requests, pip install request [segurança], mas eles não funcionaram.
Porém quando digito openssl version
eu tenho OpenSSL 0.9.8zh 14 Jan 2016
, não sei se está tudo bem.
Existe alguém que possa me ajudar com isso?
@jschwinger23 Você pode executar pip install pyopenssl ndg-httpsclient pyasn1
também, por favor?
@Lukasa Obrigado pela sua resposta. Reconfirmei que os instalei:
$ pip install pyopenssl ndg-httpsclient pyasn1
Requirement already satisfied (use --upgrade to upgrade): pyopenssl in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Requirement already satisfied (use --upgrade to upgrade): ndg-httpsclient in /Library/Python/2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pyasn1 in /Library/Python/2.7/site-packages
mas o código ainda está inativo.
De qualquer forma, descobri que tudo vai bem em Python3 e estou feliz por poder codificar em python3.
Muito obrigado.
Seguiu as instruções acima, mas ainda está enfrentando esse problema
```
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
alguma ideia?
``````
@rohanpai É provável que você não tenha sobreposição de cifras ou que o servidor remoto esteja insatisfeito com as versões que você está oferecendo ou que você deve fornecer um certificado de cliente e não o é. É difícil dar conselhos mais específicos. Tente isso para investigar o problema.
No Ubuntu 14.04LTS eu precisava fazer isso:
sudo pip install ndg-httpsclient pyasn1 --upgrade
Observe que no Ubuntu não é possível atualizar/remover pyopenssl
, pois é de propriedade do sistema operacional.
A solução de markstrefford também funcionou para mim no mac os sierra
A solução do @markstrefford também funcionou para mim.
Apenas um aviso para quem usa o OpenSSL 1.1:
Você também encontrará esse problema, mesmo ao forçar adaptadores TLS, quando o servidor remoto oferecer curvas elípticas como a primeira opção.
A causa é: http://bugs.python.org/issue29697
Ei pessoal! Estou tendo o mesmo problema com o seguinte servidor https://34.200.105.231/SID/Service.svc?wsdl
. Eu tentei de tudo e pulo de e para os mesmos 2 erros:
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:661)
Alguma ideia? @Lukasa , vejo alguns problemas com o certificado, mas parece que não deve ser tão ruim: https://sslanalyzer.comodoca.com/?url=34.200.105.231
O certificado geralmente não causa esse problema: esse problema é causado pelo servidor que desliga em nós, então geralmente é o resultado de uma incompatibilidade de conjunto de cifras. Nesse caso, é exatamente isso que está acontecendo, como você pode ver aqui .
Este é um servidor que, francamente, nunca deve ser exposto à internet aberta. Não há métodos seguros de comunicação com este servidor: nenhum, zero. É por isso que o handshake falha: Requests aceita apenas conjuntos de codificação modernos e não há conjuntos de codificação modernos disponíveis para este servidor. A melhor opção é TLS_RSA_WITH_3DES_EDE_CBC_SHA
, uma opção que removemos porque é vulnerável a ataques práticos na transferência de dados em grande escala.
Se este servidor for seu , atualize-o para uma implementação de TLS melhor ou altere as configurações. Caso contrário, meu primeiro conselho é reconsiderar sempre falar com este servidor. Se você precisar, então você pode usar o código aqui , mas eu recomendo fortemente que você pressione o operador do servidor para corrigir essa bagunça.
@Lukasa -- obrigado por trabalhar nisso com todos! Eu li e tentei a maior parte disso
Ao executar o script no Windows, tudo funciona.
Ao executar o script no OSX, receba:
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
Não estou convencido de que não seja o servidor em si, mas apreciaria qualquer ajuda adicional para confirmar e/ou me tirar dessa toca de coelho. Seria uma grande vitória fazê-lo funcionar.
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install --force-reinstall --no-cache-dir {PACKAGE}
Não tenho 100% de certeza de que a instalação no openssl realmente fez alguma coisa, pois parecia agir da mesma forma que instalar sem (como, velocidade e mensagens pareciam todas iguais)
Conforme indicado em outro tópico (acima) conectando-se diretamente via openSSL appears
para ser feliz?
openssl s_client -connect XXX.102.7.147:443
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 198 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1493384325
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
Uh...OpenSSL é tecnicamente bom, mas esse OpenSSL não negociou nenhuma cifra (ou seja, parece ter negociado SSL_NULL_WITH_NULL_NULL
. Você pode executar ssllabs em seu servidor e verificar quais conjuntos de cifras ele suporta?
@Lukasa Não está exposto na Internet, existe alguma sonda de linha de comando que eu possa disparar que possa fornecer informações adequadas para você?
Você pode tentar cipherscan .
@Lukasa o instalou ... está agindo de maneira instável (sem saída, assistindo) ... postarei de volta se eu encontrar algo que possa ser repassado. Obrigado pela orientação!
@Lukasa muito obrigado pela sua ajuda - na verdade nunca consegui que o cipherscan funcione - mas corrigiu nossos problemas. Não tinha nada a ver com nada disso e era uma incompatibilidade de IP boba em nossos ambientes... lições aprendidas! obrigada ...
Sem problemas, que bom que resolveu!
streamlink -l debug h ttpstream://https : //www.arconaitv.us/stream.php ?id=43 pior
[cli][info] streamlink está rodando como root! Tome cuidado!
[cli][debug] SO: Linux-4.14.0-041400-generic-x86_64-with-Ubuntu-14.04-trusty
[cli][depurar] Python: 2.7.6
[cli][depurar] Streamlink: 0.13.0+27.g2ff314c
[cli][debug] Requests(2.19.1), Socks(1.6.7), Websocket(0.48.0)
[cli][info] Encontrado plugin correspondente http para URL h ttpstream://https :// www.arconaitv.us/stream.php?id=43
[plugin.http][debug] URL= https://www.arconaitv.us/stream.php?id=43; params={}
[cli][info] Transmissões disponíveis: ao vivo (pior, melhor)
[cli][info] Transmissão de abertura: ao vivo (http)
[cli][debug] Pré-buffer 8192 bytes
[cli][info] Jogador inicial: /usr/bin/vlc
[cli][debug] Gravando stream na saída
[cli][info] Transmissão encerrada
[cli][info] Fechando stream atualmente aberto..
tentei mas sem sorte
atlast conseguiu funcionar tvplayer no pc local. instalei o tinyproxy no meu pc local, mas no vps httpproxy xxxx não está funcionando.
é tinyproxy ok ou eu preciso de algum outro servidor proxy para instalar no meu pc local.
Oi @maanich , isso não parece estar diretamente relacionado a esse problema ou ser um relatório de defeitos para solicitações, para o qual esse rastreador de problemas é reservado. Se você tiver dúvidas sobre a configuração do sistema, elas serão melhor abordadas em uma plataforma como o StackOverflow . Obrigado!
streamlink --https-proxy " http://8xxxx :8000/" --tvplayer-email [email protected] --tvplayer-password vcvdf3 --http-no-ssl-verify https://tvplayer.com/watch /itv best --player-no-close --stdout | /var/tmp/youtube/ffmpeg -y -i pipe:0 -vcodec copy -acodec copy -flags -global_header -hls_flags delete_segments -hls_time 10 -hls_list_size 6 /mnt/hls/arc.m3u8
ffmpeg versão 4.0-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 os desenvolvedores do FFmpeg
construído com gcc 6.3.0 (Debian 6.3.0-18+deb9u1) 20170516
configuração: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc-6 -- enable-libxml2 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame -- enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable -libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
formato libav 58. 12.100 / 58. 12.100
dispositivo libav 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
[console][info] streamlink está rodando como root! Tome cuidado!
[console][info] Encontrado plugin correspondente tvplayer para URL https://tvplayer.com/watch/itv
de erro: Impossível URL aberto: https://live.tvplayer.com/stream.m3u8?id=204&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cCo6XC9cL2xpdmUudHZwbGF5ZXIuY29tXC9zdHJlYW0ubTN1OD9pZD0yMDQiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE1MjkwNTc0OTR9LCJJcEFkZHJlc3MiOnsiQVdTOlNvdXJjZUlwIjoiNjIuMjEwLjE0Mi42NlwvMzIifX19XX0_&Signature=mHOteYcUu4QsbGD n0e ~ 7meDUGT8VN7bVOBAHa-0Mk6ROA9XHYx3aIAZMAo3dFjOGuWk-3MszJzRFHdv ~ -CCsmX3D8XQa2zvzfuIWfMAT ~ yDshroXBN25iW6ZJ0-7lGla00jMTUpm5sW-uDy18OkiBWgGvDVas2Lz-EW ~ 5-LTw2YWvEpqkvRB9OpcsHJj9RRQLuDVjwYKXwKvHTJmB1J ~sGE3aigaL7AZyBaIAUMcpk-xYMpDuPV9BsBN9AT397lFfRPFt155u~yeBHZ4JlUN2GINUBt0-CzGuYVq3dsO kYYEZJo9cQTVhArpo7ek03VbDP5egtCM8obN63AEkA__&Key-Pair-3d=APKAJGWDVCU5SXAPJELQ (Erro do cliente: Forbidden)
pipe:0 : Dados inválidos encontrados ao processar a entrada
conselho por favor n qual servidor proxy é bom para streamlink se houver
Comentários muito úteis
Infelizmente, isso não está relacionado ao problema que você identificou, e inteiramente ao OpenSSL de baixa qualidade que o OS X vem com por padrão. A versão 0.9.8y tem alguns problemas reais com a execução de handshakes SSL, e alguns servidores não o toleram bem. Usar o Python 3 na minha caixa OS X (portanto, usando um OpenSSL mais recente) revela que não há problema.
Você tem duas opções:
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
.