Регистрация сертификата Betfair API с использованием C ++ boost SSL Sockets - PullRequest
0 голосов
/ 06 марта 2019

Во-первых, спасибо, что пришли сюда. Я пытаюсь войти в систему с помощью betfair, используя сертификат для входа в систему с использованием ssl-сокетов Boost, однако, когда я отправляю свой HTTP-запрос POST, я получаю сообщение CERT_AUTH_REQUIRED . На сайте Betfair говорится, что это означает «Требуется сертификат или сертификат присутствует, но не может пройти аутентификацию с ним». Я могу подключаться, рукопожатие и отправлять / получать данные. Тем не менее, я просто не могу войти с моим кодом. Я проверил точные сертификаты с помощью curl без каких-либо проблем.

* ALPN, server accepted to use http/1.1
* Server certificate:
*        subject: C=IE; ST=Leinster; L=Dublin; O=Paddy Power Betfair Public Limi
ted Company; OU=IT Networks; CN=betfair.com
*        start date: Sep 11 05:50:38 2018 GMT
*        expire date: Sep 11 05:59:00 2020 GMT
*        issuer: C=US; O=HydrantID (Avalanche Cloud Corporation); CN=HydrantID S
SL ICA G2
*        SSL certificate verify result: self signed certificate in certificate c
hain (19), continuing anyway.
> POST /api/certlogin HTTP/1.1
> Host: identitysso-cert.betfair.com
> User-Agent: curl/7.46.0
> Accept: */*
> X-Application: AOxcQMZwVN3jOsLZ4
> Content-Length: 41
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 41 out of 41 bytes
< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=ISO-8859-1
< Content-Length: 87
< Date: Wed, 06 Mar 2019 11:09:35 GMT
<
{"sessionToken":"ZFbyo3HeAh07UFTHzhhGjOyQFeX2MKdHHHHtAm2S7FXw=","loginStatus":"SU
CCESS"}* Connection #0 to host identitysso-cert.betfair.com left intact

Я дополнительно проверил эти сертификаты с помощью кода Python, который также работает. Мой код C ++ ниже. Я попытался отправить неправильные пароли, в результате чего вместо этого статус с сервера INVALID_USERNAME_OR_PASSWORD.

boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12);

// load certificates
ctx.load_verify_file(cert_filename.c_str());
// ctx.use_private_key_file(private_filename.c_str(), boost::asio::ssl::context::pem);
ctx.use_rsa_private_key_file(private_filename.c_str(), boost::asio::ssl::context::pem);

mSocket.reset(new boost::asio::ssl::stream<tcp::socket>(mIoService, ctx));
mSocket->set_verify_mode(boost::asio::ssl::verify_peer);
mSocket->set_verify_callback(
    boost::bind(&BetfairSession::VerifyCertificate, this, _1, _2));

tcp::resolver resolver(mIoService);
tcp::resolver::query query("identitysso-cert.betfair.com", port);
tcp::resolver::iterator endpointIter = resolver.resolve(query);

Заранее большое спасибо:)

1 Ответ

1 голос
/ 06 марта 2019

Я думаю, вы путаете сертификат клиента и список CA.

Это:

ctx.load_verify_file(cert_filename.c_str());

Загружается список сертификатов CA для проверки сертификата сервера.

Вы можете найти пример этого списка здесь: http://curl.haxx.se/ca/cacert.pem

Вам также необходимо настроить сертификат для использования для соединения SSL, вы делаете это с помощью метода "use_certificate_chain_file". например,

ctx.use_certificate_chain_file(cert_filename.c_str());
...