2012-06-04 2 views
12

Selon la spécification en assistant POCO:Comment utiliser OpenSSL dans la bibliothèque de POCO C correctement

Initialiser la bibliothèque NetSSL, ainsi que OpenSSL sous-jacente bibliothèques, en appelant Poco :: Crypto :: OpenSSLInitializer: :initialiser(). Doit être appelé avant d'utiliser une classe de la bibliothèque NetSSL. NetSSL sera automatiquement initialisé via les instances Poco :: Crypto :: OpenSSLInitializer ou des mécanismes similaires lors de la création d'instances Context ou SSLManager. Cependant, il est recommandé d'appeler initializeSSL() dans tous les cas au démarrage de l'application.

Lorsque je veux utiliser HTTPSClientSession, dois-je d'abord construire un objet Application? Comment puis-je l'utiliser dans Client? N'importe quel type peut me le dire? Merci beaucoup!

Répondre

10

Jetons nets/samples/HttpGet à titre d'exemple, nous allons copier HttpGet/comme un nouveau répertoire httpsget:

  1. Makefile ouvert, ajouter "PocoNetSSL" à target_libs
  2. remplacer 'HTTPClientSession' avec « HTTPSClientSession '
  3. vous devez créer Poco :: Net :: Context pour l'utilisation SSL
  4. remplacez' session HTTPClientSession (uri.getHost(), uri.getPort()) '; avec deux lignes suivantes:
const Context::Ptr context = new Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
HTTPSClientSession session(uri.getHost(), uri.getPort(), context);

Résumé:

  1. ajouter PocoNetSSL comme LIB_DEPENDS
  2. utilisation Poco :: Net :: Contexte avec HTTPSClientSession
+2

Contexte :: VERIFY_NONE, « Client: Si ne pas utiliser un chiffrement anonyme (par défaut désactivé), le serveur envoie un certificat qui sera vérifié, mais le résultat de la vérification sera ignoré. " Cela ne va-t-il pas à l'encontre du but des certificats? – proteneer

+1

Bon point par proteneer. Passer à verificationMode = Context :: VERIFY_STRICT et loadDefaultCAs = true semble être un comportement plus sain. – thomasa88

+0

Quelque chose d'autre que 'VERIFY_NONE' semble effectivement plus sûr que' VERIFY_NONE', mais certains hôtes _have_ aucun certificat valide ... :-( –

3

Non, vous pas besoin de l'objet Application. Voici un exemple entièrement fonctionnel:

$ httpsget https://httpbin.org/user-agent 
{ 
    "user-agent": "Poco HTTPSClientSession" 
} 

code:

#include "Poco/StreamCopier.h" 
#include "Poco/URI.h" 
#include "Poco/Exception.h" 
#include "Poco/SharedPtr.h" 
#include "Poco/Net/SSLManager.h" 
#include "Poco/Net/KeyConsoleHandler.h" 
#include "Poco/Net/ConsoleCertificateHandler.h" 
#include "Poco/Net/HTTPSClientSession.h" 
#include "Poco/Net/HTTPRequest.h" 
#include "Poco/Net/HTTPResponse.h" 
#include <memory> 
#include <iostream> 

using namespace Poco; 
using namespace Poco::Net; 

class SSLInitializer { 
public: 
    SSLInitializer() { Poco::Net::initializeSSL(); } 

    ~SSLInitializer() { Poco::Net::uninitializeSSL(); } 
}; 

int main(int argc, char** argv) 
{ 
    SSLInitializer sslInitializer; 

    SharedPtr<InvalidCertificateHandler> ptrCert = new ConsoleCertificateHandler(false); 
    Context::Ptr ptrContext = new Context(Context::CLIENT_USE, "", "", "rootcert.pem", Context::VERIFY_STRICT, 9, false, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 
    SSLManager::instance().initializeClient(0, ptrCert, ptrContext); 

    try 
    { 
     if (argc > 1) 
     { 
      URI uri(argv[1]); 
      HTTPSClientSession s(uri.getHost(), uri.getPort()); 
      HTTPRequest request(HTTPRequest::HTTP_GET, uri.getPath()); 
      request.set("user-agent", "Poco HTTPSClientSession"); 
      s.sendRequest(request); 
      HTTPResponse response; 
      std::istream& rs = s.receiveResponse(response); 
      StreamCopier::copyStream(rs, std::cout); 
     } 
    } 
    catch (Exception& ex) 
    { 
     std::cout << ex.displayText() << std::endl; 
     return 1; 
    } 

    return 0; 
} 
+0

Je remarque que vous ne passez pas le contexte à la session, est-ce intentionnel? –

+0

Oui, le le contexte par défaut fourni à initializeClient() sera utilisé: https://github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/HTTPSClientSession.cpp#L63 – Alex

Questions connexes