2013-09-29 6 views
6

Ich bin auf Boost SSL Client. Es gibt einen Hinweis auf OpenSSL in den Kommentaren (sorry, keine Zeilennummern):Boost, Asio, https und Host/Zertifikat Verifcation

// The verify callback can be used to check whether the certificate that is 
// being presented is valid for the peer. For example, RFC 2818 describes 
// the steps involved in doing this for HTTPS. Consult the OpenSSL 
// documentation for more details. Note that the callback is called once 
// for each certificate in the certificate chain, starting from the root 
// certificate authority. 

Proper OpenSSL Verwendung und Überprüfung kann schwierig sein. Aus Erfahrung weiß ich, ich folgende ausführen muß korrekt die Bibliothek zu benutzen:

  • Disable SSLv2, SSLv3 und Kompression auf dem Kontextobjekt
  • das richtige Stammzertifikat für die Kettenbildung Geben und
  • Überprüfung rufen Sie SSL_get_peer_certificate und überprüfen Sie das Zertifikat nicht-NULL
  • Anruf SSL_get_verify_result und das Ergebnis verifizieren ist X509_V_OK
  • name matching Perform (CN oder SAN muss angeforderten Hostspiel)

OpenSSL 1.1.0 bietet eine Namensüberprüfung, aber nur in HEAD zu diesem Zeitpunkt. Von den OpenSSL Change Log:

Integrate hostname, email address and IP address checking with certificate 
verification. New verify options supporting checking in opensl utility. 

Und:

New functions to check a hostname email or IP address against a 
certificate. Add options x509 utility to print results of checks against 
a certificate. 

Ich sehe nicht, wo Erhöhung im Client-Code eine der Konfigurationen oder Kontrollen durchführt.

Was genau konfiguriert Boost und was wird in der Bibliothekskomponente asio bei der Verwendung von SSL überprüft oder verifiziert?

Antwort

5

Kurze Antwort: Die Boost Callback-Funktion, von dem Link, den Sie zitiert, überprüft nichts. Es gibt jedes vorläufige Verifizierungsergebnis zurück, das ihm von OpenSSL (über bool preverified) geliefert wurde. Wenn eine feinkörnige Überprüfung erforderlich ist (wie die CN-Übereinstimmung usw.), muss dies explizit durch den Rückruf durchgeführt werden.

Lange Antwort: Durch die Zeit, die OpenSSL (oder der Boost-Wrapper für OpenSSL) ruft die Verifikationsfunktion, in diesem Fall bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx), eine Reihe von vorläufiger (oder erforderlich) Überprüfung wird bereits von OpenSSL getan. Dies wird in der documentation erläutert.

Die Zertifikatskette wird beginnend mit der tiefsten Verschachtelungsebene (dem Zertifikat der Stammzertifizierungsstelle) geprüft und nach oben zum Zertifikat des Peers durchsucht. Auf jeder Ebene werden Signaturen und Ausstellerattribute überprüft. Wenn ein Überprüfungsfehler gefunden wird, wird die Fehlernummer in x509_ctx gespeichert und verify_callback wird mit preverify_ok = 0 aufgerufen. Durch Anwenden der X509_CTX_store_ * -Funktionen kann verify_callback das fragliche Zertifikat finden und zusätzliche Schritte ausführen (siehe BEISPIELE). Wenn für ein Zertifikat kein Fehler gefunden wird, wird verify_callback mit preverify_ok = 1 aufgerufen, bevor zum nächsten Level übergegangen wird.

Die Dokumentation zitiert auch ein Beispiel, wie ein feinkörniger Verifikationsrückruf geschrieben werden könnte. Sie können sich davon inspirieren lassen, je nachdem, was Ihre Bedürfnisse sind.

EDIT: Um sicher zu sein, dass Boost-internen Callback-Funktion nichts Besonderes andere tut als die Anwendung Callback-Funktion aufrufen, nahm ich einen Blick auf engine.ipp, das C++ Modul, das SSL_set_verify OpenSSL ruft Callback-Funktionen einzurichten. Sehen Sie sich an, wie verify_callback_function implementiert ist. Es ruft einfach den Anwendungsrückruf auf.

+0

Sorry wegen der späten Antwort/Daumen hoch. Stackoverflow hat etwas mit ihrer Site verändert und ihre Seite ist nun unter den EFFs (https://www.eff.org/https-everywhere) aufgeteilt. Ich musste warten, bis ich auf eine andere Maschine kam. – jww

+0

Ich glaube, es ist kaputt, auch wenn Sie den Callback implementieren. Ich bin ziemlich sicher, dass 'SSL_get_peer_certificate' immer noch aufgerufen werden muss (obwohl der Callback aufgerufen wird); 'SSL_get_verify_result' muss noch aufgerufen werden (obwohl der Callback aufgerufen wird); und beides geschieht außerhalb des Rückrufs. – jww

+0

Nichts in meinem Verständnis ist gebrochen. Der Rückruf wird aufgerufen, nachdem OpenSSL die vorläufige Überprüfung durchgeführt hat. Der Callback wird mit dem Preverification-Status aufgerufen, damit die Anwendung entscheiden kann, ob sie das Zertifikat akzeptiert oder nicht. Wenn Sie nichts mehr zu überprüfen haben, müssen Sie den Rückruf nicht einmal implementieren. '' SSL_get_peer_certificate'' und '' SSL_get_verify_result'' sind Hilfsfunktionen, die Ihnen helfen, zusätzliche Informationen über das Zertifikat und den Verifizierungsprozess zu erhalten. Es hat nichts mit Callback zu tun. So funktioniert OpenSSL ohne Boost. – Karthik