Demande HTTPS avec Boost.Asio et OpenSSL

Je suis en train de lire le symbole à https://mtgox.com/api/0/data/ticker.php à partir de mon application C++.
J'ai utiliser Boost.Asio et OpenSSL parce que le service nécessite HTTPS.

Boost version: 1.47.0

OpenSSL: 1.0.0 d [8 Fév 2011] Win32

De la demande; j'ai pris l'exemple de http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/ssl/client.cpp
pour commencer et modifié comme suit:

C'est là que je veux me connecter à:

boost::asio::ip::tcp::resolver::query query("mtgox.com", "443");

J'ai mis de vérification pour aucune raison que la négociation échoue sinon. Je ne suis pas sûr si c'est un problème avec mtgox ou que cette mise en œuvre est très stricte parce que quand j'ai imprimer le certificat à l'écran, il semble légitime (et chrome a pas de problème avec lui lors de la visite, le texte défilant de la page).

socket_.set_verify_mode(boost::asio::ssl::context::verify_none);

C'est la demande que j'ai envoyer:

std::stringstream request_;

request_ << "GET /api/0/data/ticker.php HTTP/1.1\r\n";
request_ << "Host: mtgox.com\r\n";
request_ << "Accept-Encoding: *\r\n";
request_ << "\r\n";

boost::asio::async_write(socket_, boost::asio::buffer(request_.str()), boost::bind(&client::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

(code complet: http://pastebin.com/zRTTqZVe)

Je tombe sur l'erreur suivante:

Connection OK!
Verifying:
/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority
Sending request: 
GET /api/0/data/ticker.php HTTP 1.1
Host: mtgox.com
Accept-Encoding: *

Sending request OK!

Read failed: An existing connection was forcibly closed by the remote host

Vais-je dans la bonne direction? Le message d'erreur n'est pas vraiment de la description du problème et je ne sais pas quelle étape j'ai fait de mal.

Mise à jour:
J'ai utilisé cURL pour voir ce qui n'allait pas:

curl --trace-ascii out.txt https://mtgox.com/api/0/data/ticker.php

(pleine de sortie: http://pastebin.com/Rzp0RnAK)
Elle échoue en cours de vérification.
Lorsque je me connecte avec le "dangereux" paramètre

curl --trace-ascii out.txt -k https://mtgox.com/api/0/data/ticker.php

(pleine de sortie: http://pastebin.com/JR43A7ux)

tout fonctionne bien.

Correctif:

  1. J'ai corrigé la faute de frappe dans les en-têtes HTTP
  2. J'ai ajouté un certificat racine et
    tourné la vérification SSL sur le retour.
Pourquoi avez-vous générer une clé? Vous n'êtes pas signer quoi que ce soit, le serveur est. Vous aurez besoin de faire confiance à la racine du serveur cert.
Avez-vous essayé d'envoyer cette demande par exemple via curl pour voir si le serveur l'accepte?
Bonne idée! J'ai mis à jour la question.

OriginalL'auteur Maarten | 2011-08-12