2012-06-04 16 views
12

secondo la specifica in POCO assistente:Come usare OpenSSL nella libreria POCO C++ correttamente

inizializzare la libreria NetSSL, così come l'OpenSSL sottostante librerie, chiamando Poco :: :: Crypto OpenSSLInitializer: :inizializzare(). Dovrebbe essere chiamato prima di utilizzare qualsiasi classe dalla libreria NetSSL. Il NetSSL verrà inizializzato automaticamente, tramite le istanze di Poco :: Crypto :: OpenSSLInitializer o simili durante la creazione di istanze Context o SSLManager. Tuttavia, si consiglia di chiamare initializeSSL() in ogni caso all'avvio dell'applicazione.

Quando si desidera utilizzare HTTPSClientSession, è necessario creare prima un oggetto Application? Come posso usarlo nel client? Qualcuno può dirmi? Grazie mille!

risposta

10

Diamo nette/campioni/httpget come esempio, cerchiamo di copiare httpget/come una nuova directory httpsget:

  1. aperta Makefile, aggiungere "PocoNetSSL" per target_libs
  2. sostituire 'HTTPClientSession' con 'HTTPSClientSession '
  3. è necessario creare l'uso di Poco :: Net :: Context per SSL
  4. sostituire' sessione HTTPClientSession (uri.getHost(), uri.getPort()); ' con i seguenti due linee:
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);

Sommario:

  1. aggiungere PocoNetSSL come lib_depends
  2. uso Poco :: Net :: Contesto con HTTPSClientSession
+2

Contesto :: VERIFY_NONE, "Cliente: Se non si utilizza un cifrario anonimo (per impostazione predefinita disabilitata), il server invierà un certificato che sarà controllato, ma il risultato del controllo verrà ignorato. " Questo in fondo non sconfigge il punto dei certificati? – proteneer

+1

Buon punto da parte del proteneer. Cambiare in verificationMode = Context :: VERIFY_STRICT e loadDefaultCAs = true sembra un predefinito più corretto. – thomasa88

+0

Qualcosa di diverso da "VERIFY_NONE' sembra effettivamente più sicuro di" VERIFY_NONE', ma alcuni host _have_ nessun certificato valido ... :-( –

3

No, che fai non è necessario l'oggetto Application. Ecco un esempio perfettamente funzionante:

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

Codice:

#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

Ho notato che non stai passando il contesto alla sessione, è intenzionale? –

+0

Sì, il verrà utilizzato il contesto predefinito fornito per initializeClient(): https://github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/HTTPSClientSession.cpp#L63 – Alex