Ccxt: Binance SSL: CERTIFICATE_VERIFY_FAILED

Criado em 18 dez. 2017  ·  39Comentários  ·  Fonte: ccxt/ccxt

Estou tentando me conectar ao binance e apenas testando a função load_markets, mas estou recebendo um erro de SSL.

bin = ccxt.binance({'apiKey':BinanceKey1,'secret':BinanceSecret1})
bin.verbose = True
bin.load_markets()

E saída:

https://api.binance.com/api/v1/exchangeInfo GET https://api.binance.com/api/v1/exchangeInfo 
Request: {'User-Agent': 'ccxt/1.10.343 (+https://github.com/ccxt/ccxt) Python/3.6.3', 'Accept-Encoding': 'gzip, deflate'} None
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1026, in _send_output
    self.send(msg)
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 964, in send
    self.connect()
  File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1400, in connect
    server_hostname=server_hostname)
  File "C:\ProgramData\Anaconda3\lib\ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "C:\ProgramData\Anaconda3\lib\ssl.py", line 814, in __init__
    self.do_handshake()
  File "C:\ProgramData\Anaconda3\lib\ssl.py", line 1068, in do_handshake
    self._sslobj.do_handshake()
  File "C:\ProgramData\Anaconda3\lib\ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\base\exchange.py", line 319, in fetch
    response = opener.open(request, timeout=int(self.timeout / 1000))
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 526, in open
    response = self._open(req, data)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 544, in _open
    '_open', req)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 504, in _call_chain
    result = func(*args)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/scoss/PycharmProjects/Bitcoin/ccxt_test.py", line 31, in <module>
    bin.load_markets()
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\base\exchange.py", line 786, in load_markets
    markets = self.fetch_markets()
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\binance.py", line 237, in fetch_markets
    response = self.publicGetExchangeInfo()
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\binance.py", line 669, in request
    response = self.fetch2(path, api, method, params, headers, body)
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\base\exchange.py", line 277, in fetch2
    return self.fetch(request['url'], request['method'], request['headers'], request['body'])
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\base\exchange.py", line 338, in fetch
    self.raise_error(ExchangeNotAvailable, url, method, e)
  File "C:\ProgramData\Anaconda3\lib\site-packages\ccxt\base\exchange.py", line 259, in raise_error
    details,
ccxt.base.errors.ExchangeNotAvailable: binance GET https://api.binance.com/api/v1/exchangeInfo <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)> 

Não tendo problemas com outras trocas, e este par de chave / segredo funciona sem ccxt

question

Comentários muito úteis

Este problema foi corrigido na versão 1.10.436. Vocês podem testar e verificar, por favor? Ficaremos gratos por seus relatórios!

Todos 39 comentários

Você está localizado na China?

Eu estou localizado na austrália

@scoshil você pode acessá-lo por meio de um proxy CORS público?

bin = ccxt.binance({
    'apiKey':BinanceKey1,
    'secret':BinanceSecret1,
    'proxy': 'https://cors-anywhere.herokuapp.com/',  # last slash critical
})
bin.verbose = True
bin.load_markets()

Veja também:

Parece um problema com os certificados Anaconda Python ou configurações de CA raiz ... Você viu alguma opção com relação aos certificados SSL ao instalá-los? Você pode verificar se ele tem acesso aos seus certificados de sistema / OpenSSL?

e este par de chave / segredo funciona sem ccxt

Você testou aquele par de chaves com algum outro software? Você pode esclarecer como exatamente isso "funciona"?

Eu testei esse par com a lib em https://github.com/sammchardy/python-binance e funcionou bem .... não olhei para ver se aquela lib faz algo especial com proxies ainda, mas não configure-o de forma diferente do normal.

Vou olhar esses links e ver se consigo consertar dessa forma.

Felicidades

@scoshil ok, vou verificar suas fontes sobre este problema, para ver se há uma solução alternativa para isso. THX! Entrarei em contato com você com um acompanhamento.

@scoshil você pode colar aqui o trecho de código que usou com https://github.com/sammchardy/python-binance para teste, por favor?

você quer dizer de python-binance?

Código de teste:

from binance.client import Client
client = Client(BinanceKey1,BinanceSecret1)
    order = client.create_order(symbol='BTCUSDT',side="SELL",type="LIMIT",price=21000,quantity=0.001,timeInForce='GTC')
    print(order)

Resultado:

{'symbol': 'BTCUSDT', 'orderId': 10690384, 'clientOrderId': 'w4N8ngpjd4lZvF2Pn8XfZa', 'transactTime': 1513577527632, 'price': '21000.00000000', 'origQty': '0.00100000', 'executedQty': '0.00000000', 'status': 'NEW', 'timeInForce': 'GTC', 'type': 'LIMIT', 'side': 'SELL'}

Sim obrigado ...

Isso ajuda com o ccxt?

https://github.com/ContinuumIO/anaconda-issues/issues/494#issuecomment -156177729

@kroitor eu tentei isso e ainda me dá o mesmo erro, infelizmente

@scoshil python-binance funciona porque usa o pacote requests python e que, por sua vez, também se vincula a certificados SSL não padrão do pacote certifi . ccxt usa HTTP embutido puro e por algum motivo uma instalação particular do conda não encontrará seus certificados SSL / CA padrão ... Se nenhum dos links acima e sugestões ajudarem, podemos mudar para requests também. Você pode descobrir onde ele armazena certificados em seu sistema?

Eu também sugiro tentar isso: https://stackoverflow.com/questions/33699577/conda-update-failed-ssl-error-ssl-certificate-verify-failed-certificate-ver (ou google para mais "anaconda SSL "ou" conda SSL "," anaconda ssl verify ", etc ...)

Se nada ajudar, farei uma instalação limpa do Anaconda Python em um PC virtual com Windows e testarei / corrigirei então ...

@scoshil pode, por favor, tentar reinstalar o python anaconda? (uma nova distribuição de seu site, se estiver ok para você) ... você nos ajudaria a descartar uma possível causa ...

Obrigado, vou tentar as coisas que você mencionou e relatar ... pode demorar um pouco para fazer uma instalação limpa do anaconda embora

Ok, tentei o seguinte:

Realmente sem ideias neste momento ...

@scoshil ok, muito obrigado pelo seu esforço e por nos reportar! Teremos que migrar para requests+certifi para seus certificados SSL. Avisarei você sobre o progresso, espero que muito em breve.

Obrigado!

@scoshil Não consigo reproduzir o problema da minha máquina Windows 10 da Rússia, consigo acessar o Binance normalmente ...

screen shot 2017-12-19 at 10 09 02

Como você pode ver, uma nova instalação do Anaconda3 funciona do meu lado ... Então, talvez você tenha alguns certificados que estão desatualizados ou algo assim ... No entanto, não sei se faz sentido, porque você fez uma reinstalação limpa. ..

Depois de instalar o anaconda, encontrei estes dois certificados em minha configuração C:\Users\myusername\AppData\local\Continuum\anaconda3\ssl :

cert.zip

Você pode tentar copiá-los em sua pasta SSL para ver se eles fazem alguma diferença (salve uma cópia de backup dos certificados existentes com antecedência). A correção está a caminho ...

Além disso, se possível, execute o seguinte para ver se o problema está realmente relacionado aos certificados SSL padrão:

import requests
print(requests.get('https://api.binance.com/api/v1/exchangeInfo').text)

O trecho acima funciona?

Eu executei o que você sugeriu e esta é a saída:

{"fuso horário": "UTC", "serverTime": 1513694282583, "rateLimits": [{"rateLimitType": "REQUESTS", "intervalo": "MINUTE", "limit": 1200}, {"rateLimitType": " ORDERS "," interval ":" SECOND "," limit ": 10}, {" rateLimitType ":" ORDERS "," interval ":" DAY "," limit ": 100000}]," exchangeFilters ": [], "symbols": [{"symbol": "ETHBTC", "status": "TRADING", "baseAsset": "ETH", "baseAssetPrecision": 8, "quoteAsset": "BTC", "quotePrecision": 8, "orderTypes":

........

{"filterType": "MIN_NOTIONAL", "minNotional": "0.01000000"}]}, {"símbolo": "OSTBNB", "status": "TRADING", "baseAsset": "OST", "baseAssetPrecision": 8 , "quoteAsset": "BNB", "quotePrecision": 8, "orderTypes": ["LIMIT", "LIMIT_MAKER", "MARKET", "STOP_LOSS_LIMIT", "TAKE_PROFIT_LIMIT"], "icebergAllowed": true, "filters" : [{"filterType": "PRICE_FILTER", "minPrice": "0,00001000", "maxPrice": "10000.00000000", "tickSize": "0,00001000"}, {"filterType": "LOT_SIZE", "minQty": " 0.01000000 "," maxQty ":" 10000000.00000000 "," stepSize ":" 0.01000000 "}, {" filterType ":" MIN_NOTIONAL "," minNotional ":" 1.00000000 "}]}]}

Parece funcionar corretamente. Eu sou aquele que relatou # 904

@ hexdump2002 obrigado! Isso confirma meu pensamento inicial. Ok, a correção para isso virá em breve.

Muito obrigado. Nós realmente precisamos porque a biblioteca trava em algo tão básico ... A propósito, seu trabalho com a lib é incrível. Obrigado por compartilhar!

@ hexdump2002 obrigado! A propósito, só para completar, se não é segredo, qual é o seu país / região / continente?

Europa / Espanha, fornecerei tudo o que você precisar :)

@kroitor : Sem intenção de te apressar nem nada, você tem algum HEC para que esse bug seja corrigido? Estamos presos nisso agora :).

@ hexdump2002 hoje ou amanhã.

@kroitor , posso confirmar que tenho a mesma saída de @ hexdump2002 para o código de solicitações que você forneceu

Também tentei substituir meus certificados SSL e não mudou nada

@kroitor também queria apenas agradecer por compartilhar a biblioteca! O trabalho que foi feito até agora foi ótimo!

Seguindo as sugestões de "mudar para biblioteca de solicitações" que você comentou ontem. Isso afetará a parte cctx.async da biblioteca? Quer dizer, as solicitações não são compatíveis com async, então teremos chamadas de sincronização sempre que usarmos async ou não. Você poderia dar um pouco de informação sobre isso?

@ hexdump2002

Isso afetará a parte cctx.async da biblioteca?

Não, se você pretende quebrar a versão assíncrona, isso não afetará o ccxt.async. Mas sim, se você quer dizer mudar o async para uma implementação de solicitações compatível com async - isso afetará apenas a implementação. A interface permanece a mesma.

Quer dizer, as solicitações não são compatíveis com async

Sim, mas não vamos usar a versão síncrona de requests em nosso subpacote async , é claro. Vamos integrar uma implementação assíncrona de solicitações, como requests-futures , ou alguma outra implementação que se encaixe melhor para este trabalho.

portanto, teremos chamadas de sincronização sempre que usarmos async ou não.

Não, você ainda terá os modos de sincronização e verdadeiro assíncrono disponíveis.

Espero que responda sua pergunta, me avise se tiver mais)

Sim, eu entendo o que você quer dizer. Então, a nova correção que virá para este bug (o SSL) irá corrigir as duas versões? sincronizar e async? Ou você está corrigindo apenas a parte sincronizada primeiro?

Então, a nova correção que virá para este bug (o SSL) irá corrigir as duas versões? sincronizar e async?

Sim, vamos consertar os dois, no entanto, vamos fazer upload da correção de sincronização primeiro e, em seguida, da correção de async

Ou você está corrigindo apenas a parte sincronizada primeiro?

Sim, mas haverá pouco ou nenhum atraso entre a correção de sincronização e a correção assíncrona consequente. Estamos determinados a consertar os dois agora, no entanto, não podemos consertá-los simultaneamente (implementações subjacentes diferentes), portanto, a versão de sincronização é esperada primeiro e, em seguida, a assíncrona.

Este problema foi corrigido na versão 1.10.436. Vocês podem testar e verificar, por favor? Ficaremos gratos por seus relatórios!

Ok, parece funcionar agora. Se precisar que eu faça algum teste me avise. Muito obrigado. Ficarei muito feliz quando você corrigir a versão assíncrona também: D. Bom trabalho!

Esperando ver em breve!

@kroitor , sou do exemplar # 911
Pelo que eu posso dizer, o problema parece estar resolvido :)
Agora é a hora de me familiarizar com seu código e criar alguns scripts básicos.

Obrigado pelo suporte rápido e pela grande biblioteca

@kroitor Você nos informará aqui quando a versão assíncrona for corrigida?

Também uma pequena observação, não tenho certeza se o problema de SSL está relacionado a todas as trocas, no entanto, ao executar o exemplo async-gdax-fetch-order-book-continously.py, parece funcionar com GDAX, mas não quando eu mudo para binance

@aekramer

Você nos informará aqui quando a versão assíncrona for corrigida?

Claro, vem a seguir.

parece funcionar com GDAX, mas não quando mudo para binance

Vou analisar isso, obrigado por relatar

@kroitor testou a correção e está funcionando conforme o esperado agora! Obrigado novamente!

Esta página foi útil?
0 / 5 - 0 avaliações