我的 https C++ 代码在某些网站上不起作用 (binance)
my https C++ code doesn't work on some sites (binance)
我使用 OpenSSL 在 C++ 中创建了一个 https class。它适用于大多数 sites/urls,但不适用于以下 sites/urls:
- https://api.binance.com/api/v1/klines?symbol=BTCUSDT&interval=1m&startTime=0&limit=1
- https://api.binance.com/api/v1/exchangeInfo
我可以使用 browser/wget/postman 打开它们,所以它们还不错 link。
我也确定我的 request/headers 有效且正确。
我怀疑 SSL 版本问题,但我尝试了 OpenSSL 中的所有版本但没有运气(SSLv3,TLS 1.1/1.2)
服务器立即关闭我的连接,甚至在我发送 headers.
之前
这是我的请求的示例,我认为它没有错。
因为我找不到任何错误并且相同的代码适用于其他 sites/urls.
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));
此站点要求客户端使用 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. See this code in s_client.c 了解如何使用此功能。
我使用 OpenSSL 在 C++ 中创建了一个 https class。它适用于大多数 sites/urls,但不适用于以下 sites/urls:
- https://api.binance.com/api/v1/klines?symbol=BTCUSDT&interval=1m&startTime=0&limit=1
- https://api.binance.com/api/v1/exchangeInfo
我可以使用 browser/wget/postman 打开它们,所以它们还不错 link。 我也确定我的 request/headers 有效且正确。 我怀疑 SSL 版本问题,但我尝试了 OpenSSL 中的所有版本但没有运气(SSLv3,TLS 1.1/1.2)
服务器立即关闭我的连接,甚至在我发送 headers.
之前这是我的请求的示例,我认为它没有错。 因为我找不到任何错误并且相同的代码适用于其他 sites/urls.
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));
此站点要求客户端使用 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. See this code in s_client.c 了解如何使用此功能。