HTTPS-client-und-server zusammen mit C++ und den POCO-Bibliotheken (SSL-Kontext-Probleme)?

Arbeite ich auf ein C++ - Projekt, die sowohl konsumieren, und bieten RESTful HTTPS-web-services (ist das nicht eine schöne Kombination!) und gewählt haben die POCO-Bibliotheken machen es Arbeit (für die Lizenz, Plattform-Unterstützung, Benutzerfreundlichkeit und/Anpassungsfähigkeit Gründen, die ich gewonnen T gehen in Sie hier). Ich bin neu bei POCO und OpenSSL, die es verwendet, um HTTPS-Funktionalität.

Das Problem, das ich habe laufen in ist, dass es scheint, dass die SSLManager-und Kontext-Klassen (von POCO ist NetSSL_OpenSSL Bibliothek) unterstützen nur entweder der client oder der server zusammenhängen, aber nicht beide. Ich habe getestet, dass dies der Fall mit einem einfachen HTTPS-client und server. Also ich habe einige Graben in die POCO-code und für die SSLManager ist Teil der server-Funktionalität zu sein scheint, eine Obermenge der client-Funktionalität (also ich könnte das initializeServer() - Methode auf, und es sollte funktionieren). Wo ich zu sein scheinen in Schwierigkeiten ist, der Kontext, das scheint server als ein wrapper um ein OpenSSL-Kontext Struktur (halten Sie die Heartbleed-Witze, bitte! 🙂 ).

Nun, nach einiger Suche stieß ich auf auf dieser Seite, die hat eine nette kleine Tabelle, die mir erklärt, das OpenSSL-Neuling, dass ich brauche, um das ausfüllen eines SSL_METHOD Struktur, um einen OpenSSL-Kontext, und hier sind ein paar Konserven diejenigen, die OpenSSL bietet für client -, server -, und in Kombination verwendet (für diejenigen, die Folgen Sie diesem link, Nein, ich bin nicht dabei alles rund um OpenVMS, ich bin auf Windows und Linux für die Zwecke dieser Frage). Und sicher genug in der POCO-Kontext createSSLContext() Methode mehrere der SSL_METHODs aus der Tabelle verwendet, die jedoch nicht die für die Kombination von client und server.

Ich habe versucht, Sie den POCO-code hinzufügen ein "MIXED_USE" Nutzung und Aktualisierung der Kontext-code entsprechend und aus meiner Spielzeug-Beispiel scheint es zu funktionieren. Das bringt mich zu meiner Frage. Bin ich etwas fehlt, die würde oder führen könnte, die mir Probleme die Straße hinunter, wenn ich diesen Weg gehen? Neben den offensichtlichen "sowie POCO verweist außerdem auf die Verwendung geben Sie hier Ihr blind idiot" Fragen, gibt es keine negativen Effekte, die ich vielleicht in von der im Grunde zu einer Reihe von OpenSSL (wrapper) - code und einfaches ändern der SSL-Methode für die SSL-Kontext in meinem web-services? Jede Hilfe/Zeiger/Gedanken sind geschätzt.


TL;DR-version: POCO HTTPS Bibliotheken erwarten, dass Sie entweder die client-oder server-OpenSSL-Kontext, aber ich möchte Sie optimieren und ändern Sie einfach die SSL_METHOD zu unterstützen, eine kombinierte client-und server-OpenSSL-Kontext? Wie krank bin ich?


BEARBEITEN 4/24/2014: So in der Antwort auf jww Antwort, lassen Sie mich skizzieren, den Zusammenhang der Klasse ein wenig. Es ist im Grunde umschließt einen Zeiger auf eine OpenSSL-Kontext, Struktur, benannt _pSSLContext. Dem Konstruktor gibt es eine Usage enum-parameter (welche ein Mitglied _usage), die hat ein paar mögliche Werte. Als Teil des Kontext-Objekts, Initialisierung ruft eine interne Methode, die aufgerufen createSSLContext() die wie folgt aussieht:

void Context::createSSLContext()
{
    if (SSLManager::isFIPSEnabled())
    {
        _pSSLContext = SSL_CTX_new(TLSv1_method());
    }
    else
    {
        switch (_usage)
        {
        case CLIENT_USE:
            _pSSLContext = SSL_CTX_new(SSLv23_client_method());
            break;
        case SERVER_USE:
            _pSSLContext = SSL_CTX_new(SSLv23_server_method());
            break;
        case TLSV1_CLIENT_USE:
            _pSSLContext = SSL_CTX_new(TLSv1_client_method());
            break;
        case TLSV1_SERVER_USE:
            _pSSLContext = SSL_CTX_new(TLSv1_server_method());
            break;
        default:
            throw Poco::InvalidArgumentException("Invalid usage");
        }
    }
    if (!_pSSLContext) 
    {
        unsigned long err = ERR_get_error();
        throw SSLException("Cannot create SSL_CTX object", ERR_error_string(err, 0));
    }

    SSL_CTX_set_default_passwd_cb(_pSSLContext, &SSLManager::privateKeyPassphraseCallback);
    Utility::clearErrorStack();
    SSL_CTX_set_options(_pSSLContext, SSL_OP_ALL);
}

Ich denke, ich sollte in der Lage sein, um einen anderen Wert hinzuzufügen, um die Usage enum, die bewirken würde, dass die switch-Anweisung oben machen Anruf initialisieren des Kontexts mit der SSL_METHOD wird SSLv23_method(). Ich getestet habe dies in einem Spielzeug Beispiel und es scheint zu funktionieren.

Meine Sorge, die led zu meiner Frage, ist, dass es möglicherweise Nebenwirkungen einer Veränderung wie dieser. Ich weiß nicht, POCO oder OpenSSL genug, um zu wissen, ob es andere Hebel muss ich ziehen, um zu machen, die Arbeit. Zum Beispiel, wenn es gibt etwas über die SSLv23_server/client_method()s, wo das einlegen der SSLv23_method() an seiner Stelle ohne Veränderung woanders etwas zu brechen könnte etwas (möglicherweise so subtil).

  • Aus Neugier, warum sind Sie versuchen, die Wiederverwendung der Kontext für beide client und server, wenn die docs sagen Sie sonst?
  • Dies muss sich ändern: _pSSLContext. Benötigen Sie eine client-Kontext und einen server-Kontext. Auch isFIPSEnabled macht keinen Sinn - seine-pinning zu TLS 1.0 und abwerfen von TLS 1.1 und 1.2. Schließlich, diejenigen sind einige shitty-Optionen (oder deren fehlen). SSL_OP_ALL nicht schneiden Sie es, wie es nur versorgt, einige Fehler Problemumgehungen Arbeit. SSL_OP_ALL ist 0x80000BFF noch SSL_OP_NO_COMP ist 0x00020000 (Kompression Lecks Token/cookies und andere sensible Daten durch CRIME) und SSL_OP_NO_SSLv2 ist 0x01000000 (SSLv2 ist komplett kaputt).
  • SSLv23_method ist OK (es die Art und Weise, es zu benutzen). Es wird Sie "SSLv2 und oben". Aber man muss hinzufügen, anderen Kontext Optionen wie SSL_OP_NO_SSLv2 und SSL_OP_NO_SSLv3. Das bekommt man "TLS 1.0 und höher". Sie sollten wahrscheinlich betrachten Notwasserung POCO und verwenden Sie etwas, das mehr ist vielseitig und achtsam zu Sicherheits-Druck.
  • SSL_OP_CIPHER_SERVER_PREFERENCE ist auch nicht vorhanden. Sie müssen es stoppen, aufhören, dumme Kunden zu tun dumme Dinge wie die Wahl RC4_128_WITH_MD5. Auch fehlt ein Aufruf von SSL_CTX_set_cipher_list(3), die würden die cipher-Liste, um die 16 oder 20 oder so gewünscht (anstatt die gesamte cipher-suite-zoo).
  • Rasieren Sie die cipher-Liste mit SSL_CTX_set_cipher_list(3) ist auch wichtig für die Kunden der Durchreise F5 und Ironport appliances. F5 und Ironport appliances ersticken, weil Sie eine Feste Größe der Puffer, und die extra 160 bytes oder so (zur Darstellung der Chiffren) überlauf der Feste Puffer, die dazu führt, unerklärliche "Fehler beim verbinden" - Krimis.
InformationsquelleAutor DAG | 2014-04-24
Schreibe einen Kommentar