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. AuchisFIPSEnabled
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
ist0x80000BFF
nochSSL_OP_NO_COMP
ist0x00020000
(Kompression Lecks Token/cookies und andere sensible Daten durch CRIME) undSSL_OP_NO_SSLv2
ist0x01000000
(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 wieSSL_OP_NO_SSLv2
undSSL_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 WahlRC4_128_WITH_MD5
. Auch fehlt ein Aufruf vonSSL_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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantwortung meiner eigenen Frage später, ich war in der Lage zu Bearbeiten Sie den POCO-code, mir zu erlauben, ist die genaue Angabe eines "Sowohl-als -" Kontext. Ich aktualisierte den code, den ich anfangs gepostet werden wie:
Ändern Sie den code wie diesem erlaubt, meine Bewerbung zu handeln, da beide eine HTTPS-server und client. Wenn jemand im selben Boot ich war, ich hoffe, das setzt Ihren Verstand an der Mühelosigkeit.
Gut, ich weiß nicht, POCO, also kann ich nicht kommentieren. Aber es scheint, dass Sie wollen, zu einem einzigen Kontext für
POCO_Client_Ctx
undPOCO_Server_Ctx
(nur zu raten die Namen, weil es keinen code zur Verfügung gestellt).In diesem Fall, Sie könnten in der Lage sein, um die Wiederverwendung der gleichen OpenSSL-Kontext. Die wiederverwendet Zusammenhang sollte die gemeinsame Optionen, wie Protokolle und Ihre privaten PKI-CA.
Dann, Ihr code:
Vom
CreateSSLContext
, dieSSL_CTX*
hat einen reference count von 1. Sie können dieSSL_CTX*
für das Leben der beiden POCO-client und-server. Oder Sie können die Schrittweite mit der folgenden und löschen es wird:SSL_CTX_free
wird dekrementiert den Referenzzähler. Nach dem count den Wert 0 erreicht, wird die Bibliothek löschenSSL_CTX*
.POCO_Client_Ctx
undPOCO_Server_Ctx
schließlich verwenden dieSSL_CTX*
zu bekommenSSL*
Referenz. Müssen Sie wahrscheinlich zu Holen dasSSL*
von der POCO-Bibliothek.Können Sie weitere Feinabstimmung der Eigenschaften auf die
SSL*
mitSSL_*
Funktionen. Zum Beispiel, dieSSL*
verwendetPOCO_Client_Ctx
nennen könnteSSL_set_tlsext_host_name
; während diePOCO_Server_Ctx
nennen könnteSSL_use_certificate
.Im Allgemeinen jedoch, ich habe immer einen eigenen Kontext für clients und Server; und ich habe Sie wiederverwendet Zusammenhänge zwischen den clients und wiederverwendet werden Zusammenhänge zwischen den Servern. Aber ich habe noch nie vermischten Gegenstände client und server zusammenhängen.