我的https C ++代码在某些网站上不起作用(binance)

时间:2018-04-20 20:11:19

标签: c++ ssl https openssl cryptocurrency

我使用OpenSSL在C ++中创建了一个https类。它适用于大多数网站/网址,但不适用于以下网站/网址:

我可以使用浏览器/ wget / postman打开它们,因此它们不是很糟糕的链接。 我还确定我的请求/标题是有效的&正确。 我怀疑SSL版本存在问题,但我在OpenSSL中尝试了所有版本但没有运气(SSLv3,TLS 1.1 / 1.2)

服务器立即关闭我的连接,甚至在我发送标题之前。

这是我的要求的一个例子,我不认为这是错的。 因为我找不到任何错误,并且相同的代码可以与其他网站/网址一起使用。

GET /api/v1/exchangeInfo HTTP/1.1
Accept: */*
Accept-Encoding: gzip,deflate
Connection: keep-alive
Host: api.binance.com
User-Agent: evo

我不知道是什么造成的。谁知道为什么?

谢谢!

  SslSocket ssl;
  st = ssl.create();
  st = ssl.connect("api.binance.com:443");

  const char* req_header = "GET /api/v1/exchangeInfo HTTP/1.1\r\n"
      "Host: " "api.binance.com" "\r\n"
      "\r\n";
  st = ssl.send(req_header, strlen(req_header));

  while (true){
      char buff[ 1024 ] = {};
      size_t recv_size = 0;
      st = ssl.recv(recv_size, buff, sizeof(buff) - 1);
      if (!st) break;

      if (recv_size > 0)
          fwrite(buff, 1, recv_size, stdout);
  }

我做了类似的事情来设置我的ssl套接字:

const SSL_METHOD *method = SSLv23_client_method(); 
_ctx = SSL_CTX_new(method);
_ssl = SSL_new(_ctx);
SSL_set_fd(_ssl, _socket.fd());
_socket.connect(addr);
SSL_connect(_ssl);
printf("SSL_get_version2: %s\n", SSL_get_version(_ssl));

1 个答案:

答案 0 :(得分:2)

此站点要求客户端使用SNI扩展。如果没有SNI扩展,你可以得到:

$ openssl s_client -connect api.binance.com:443
...
140269619467928:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:772:
...
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000

借助SNI扩展,你可以得到:

$ openssl s_client -connect api.binance.com:443 -servername api.binance.com
...
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256

要在代码中使用SNI,请使用SSL_set_tlsext_host_name。有关如何使用此功能,请参阅this code in s_client.c