2012-06-04 9 views
12

De acuerdo con la especificación en Poco asistente:Cómo utilizar OpenSSL en la biblioteca POCO C++ correctamente

inicializar la biblioteca NetSSL, así como el OpenSSL subyacente bibliotecas, llamando Poco :: :: Crypto OpenSSLInitializer: :inicializar(). Debería llamarse antes de usar cualquier clase de la biblioteca de NetSSL. El NetSSL se inicializará automáticamente, a través de Instancias de Poco :: Crypto :: OpenSSLInitializer o mecanismos similares al crear instancias de Context o SSLManager. Sin embargo, se recomienda llamar a initializeSSL() en cualquier caso al inicio de la aplicación.

Cuando quiero usar HTTPSClientSession, ¿tengo que construir primero un objeto Aplicación? ¿Cómo puedo usarlo en el Cliente? ¿Algún tipo puede decirme? ¡Muchas gracias!

Respuesta

10

Tomemos netos/muestras/HTTPGet como ejemplo, vamos a copiar HTTPGet/como un nuevo directorio httpsget:

  1. Makefile abierta, añadir "PocoNetSSL" a target_libs
  2. reemplazar 'HTTPClientSession' con 'HTTPSClientSession '
  3. necesita crear Poco :: Net :: Contexto para uso SSL
  4. reemplazar' sesión de HTTPClientSession (uri.getHost(), uri.getPort()); ' con dos líneas siguientes:
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);

Resumen:

  1. añadir PocoNetSSL como un LIB_DEPENDS
  2. uso Poco :: Net :: Contexto con HTTPSClientSession
+2

Contexto :: VERIFY_NONE, "Cliente: Si no se utiliza un sistema de cifrado anónimo (por defecto desactivado), el servidor enviará un certificado que será verificado, pero el resultado de la verificación será ignorado ". ¿No es esto básicamente una derrota al punto de los certificados? – proteneer

+1

Buen punto por proteneer. Cambiar a verificationMode = Context :: VERIFY_STRICT y loadDefaultCAs = true parece una opción predeterminada más sensata. – thomasa88

+0

Cualquier cosa que no sea 'VERIFY_NONE' parece de hecho más seguro que' VERIFY_NONE', pero algunos hosts _tienen_ ningún certificado válido ... :-( –

3

No, lo hace no necesita el objeto Aplicación. Aquí está un ejemplo totalmente funcional:

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

Código:

#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

Me doy cuenta de que no está pasando el contexto a la sesión, ¿es eso intencional? –

+0

Sí, el se usará el contexto predeterminado provisto para initializeClient(): https://github.com/pocoproject/poco/blob/poco-1.7.8/NetSSL_OpenSSL/src/HTTPSClientSession.cpp#L63 – Alex

Cuestiones relacionadas