2012-06-04 8 views
12

gemäß der Spezifikation in POCO Assistenten:Wie OpenSSL in POCO C++ Bibliothek verwendet korrekt

die NetSSL Bibliothek initialisieren, sowie die OpenSSL zugrunde liegenden Bibliotheken, von Poco Aufruf :: Crypto :: OpenSSLInitializer: :initialisieren(). Sollte vor dem Verwenden einer Klasse aus der NetSSL-Bibliothek aufgerufen werden. Die NetSSL wird automatisch initialisiert, durch Poco :: Crypto :: OpenSSLInitializer Instanzen oder ähnliche Mechanismen beim Erstellen von Context oder SSLManager-Instanzen. Es wird jedoch empfohlen, initializeSSL() in jedem Fall beim Start der Anwendung aufzurufen.

Wenn ich HTTPSClientSession verwenden möchte, muss ich zuerst ein Anwendungsobjekt erstellen? Wie kann ich es in Client verwenden? Jeder kann mir sagen, ich danke Ihnen sehr!

Antwort

10

Net/Proben nehmen lassen/httpget als Beispiel, lassen Sie uns httpget/als neues httpsget Verzeichnis kopieren:

  1. offen Makefile, fügen Sie "PocoNetSSL"
  2. ersetzen 'HTTPClientSession' target_libs mit ‚HTTPSClientSession '
  3. Sie müssen Poco :: Net :: Context für SSL verwenden
  4. ersetzen' HTTPClientSession-Sitzung (uri.getHost(), uri.getPort()); ' mit folgenden zwei Zeilen:
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);

Zusammenfassung:

  1. hinzufügen PocoNetSSL als LIB_DEPENDS
  2. Verwendung Poco :: Net :: Context mit HTTPSClientSession
+2

Kontext :: VERIFY_NONE „Kunde: Wenn nicht eine anonyme Chiffre (standardmäßig deaktiviert), wird der Server ein Zertifikat senden, die sein wird, überprüft, aber das Ergebnis der Prüfung wird ignoriert. " Beendet das nicht im Grunde genommen den Sinn von Zertifikaten? – proteneer

+1

Guter Punkt von proteineer. Der Wechsel zu verificationMode = Context :: VERIFY_STRICT und loadDefaultCAs = true scheint ein vernünftigerer Standard zu sein. – thomasa88

+0

Alles andere als 'VERIFY_NONE' scheint tatsächlich sicherer zu sein als' VERIFY_NONE', aber einige Hosts _have_ kein gültiges Zertifikat ... :-( –

3

Nein, Sie tun brauche das Application-Objekt nicht. Hier ist ein voll funktionsfähiges Beispiel:

$ 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

Ich merke, dass Sie den Kontext nicht an die Sitzung übergeben, ist das beabsichtigt? –

+0

Ja, die Der für initializeClient() bereitgestellte Standardkontext wird verwendet: https://github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/HTTPSClientSession.cpp#L63 – Alex

Verwandte Themen