SSL-Zertifikat, nicht über Sparsamkeit authentifizierend, aber OK über Browser

8

So erstelle ich mein SSL-Zertifikat, Schlüssel, etc:

%Vor%

Das funktioniert, ich kann die Ausgabe in Chrome sehen, obwohl ich eine Warnung bekomme, dass ich zuerst Viren bekomme.

%Vor%

Dies ist ein Ausschnitt vom Server. Ich bin ehrlich, ich bin mir nicht sicher, was genau jede Zeile macht, obwohl ich eine gute Idee habe:

%Vor%

Kunde:

%Vor%

[1] Ссылка

Wenn ich loadTrustedCertificates im Client auskommentiere, erhalte ich eine SSL-Ausnahme für nicht verifiziertes Zertifikat. Wenn diese Zeile übrig ist, bekomme ich eine Ausnahme wegen eines Ausnahmefehlers.

Hier sind 2 viel längere Code-Fragmente, die die obigen Snippets in eine bessere Perspektive bringen.
Server:

%Vor%

Kunde:

%Vor%

Danke, dass Sie sich die Zeit genommen haben, dies zu lesen. Wenn es eklatante Fehler gibt, werde ich mich freuen, davon zu hören. Das war jetzt zu lange der Fluch meiner Existenz. Zu lange.

    
demonslayer319 09.06.2012, 21:35
quelle

1 Antwort

10

Es scheint, dass Sie selbstsignierte Zertifikate generieren (was gut ist), aber die Operationen, die Sie mit dem Dienstprogramm openssl ausführen, sind verwirrend.

Zeile 1 ist OK, es generiert einen privaten Schlüssel.
Zeile 2 ist nutzlos: Der Ausgabeschlüssel ist der gleiche wie der Eingabetaste! (Versuchen Sie diff die zwei Schlüssel zu sehen).
Zeile 3 erzeugt einen CSR und Zeile 4 signiert es selbst, damit sie in einer Zeile zusammengeführt werden können, wie wir sehen werden.

Lasst uns jetzt einen Schritt zurück gehen und versuchen zu verstehen, was wir tun: -)

Sie verwenden SSL zum Authentifizieren und Verschlüsseln der Kommunikation zwischen einem Thrift-Server und einem Thrift-Client. Ich nehme an, Sie wollen beide:

  1. Schützen Sie den Client vor einem Rogue-Server (was Ihr Code versucht)
  2. Schützen Sie den Server vor einem Rogue-Client (was mir noch wichtiger erscheint).

Um eine HTTPS-Analogie zu erstellen, ist (1) das klassische Serverzertifikat, (2) ist normalerweise ein Benutzername / Passwort für den Benutzer. Aber mit Thrift SSL erhalten wir eine gegenseitige Authentifizierung, indem wir ein Zertifikat auch an den Client ausstellen.

Die Beispiele, die ich machen werde, verwenden selbstsignierte Zertifikate. Sie können leicht an eine Mini-CA angepasst werden, die von openssl verwaltet wird, und ich überlasse es dem Leser als Übung.

Generieren Sie den privaten Schlüssel des Servers:
openssl genrsa -out server-key.pem 2048

Generieren Sie den zugeordneten öffentlichen Schlüssel und signieren Sie ihn selbst:
openssl req -new -x509 -key server-key.pem -out server-cert.pem -days 10000

Generieren Sie den privaten Schlüssel des Clients:
openssl genrsa -out client-key.pem 2048

Generieren Sie den zugeordneten öffentlichen Schlüssel und signieren Sie ihn selbst:
openssl req -new -x509 -key client-key.pem -out client-cert.pem -days 10000

Hinweis: Wenn openssl req nach "Common Name (e.g. server FQDN or YOUR name)" fragt, geben Sie den FQDN des Hosts ein, auf dem das Thrift-Programm ausgeführt werden soll. Dies ermöglicht es, die AccessManager -Klasse von Thrift nicht anzupassen. Wenn der FQDN andererseits nicht im Voraus bekannt sein kann, muss AccessManager erben und die Methoden verify() entsprechend überschrieben werden. Siehe TSSLSocket.cpp .

Gut, jetzt zum Code.

Auf der Serverseite:

socketFactory->server(true); ist redundant, entferne es.

socketFactory->authenticate(false) ist ein bisschen irreführend. Ein besserer Name wäre authenticatePeer . Wenn Sie false sagen, wird der Client nicht authentifiziert, aber wir haben uns entschieden, bevor wir eine gegenseitige Authentifizierung wünschen.

Eine SSL-Präambel für einen Server lautet also:

%Vor%

Wo myKey ist server-key.pem , myCert ist server-cert.pem und trustedCerts ist ... entweder das Zertifikat einer vertrauenswürdigen Zertifizierungsstelle oder, im Falle eines selbstsignierten Zertifikats, das Zertifikat der Klient. Sie können cat multiple certs nacheinander in derselben Datei erstellen. In unserem Beispiel fügen wir client-cert.pem , das wir zuvor erstellt haben, hinzu.

Eine SSL-Präambel für einen Client ist genau die gleiche, mit dem richtigen privaten Clientschlüssel, Client-Zertifikat und für trustedCerts das Zertifikat des Peers: server-cert.pem , das wir zuvor erstellt haben.

Das ist alles :-) Versuchen Sie zu verstehen, bevor Sie springen, um es zu codieren, wenn Sie kein klares Bild davon haben, wie SSL (gegenseitige) Authentifizierung funktioniert, ist es schwierig, die Fehlermeldungen zu verstehen. Der Code, den ich zeigte, wurde getestet, um zu funktionieren.

Dokumentationsweise, leider Thrift ist nah an nichts. Für SSL sehen Sie: lib/cpp/README.SSL , test/cpp/src/TestServer.cpp und test/cpp/src/TestClient.cpp . Sei gewarnt, dass TestServer.cpp keine gegenseitige Authentifizierung durchführt, was ein Fehler IMHO ist.

    
marco.m 03.07.2012, 21:59
quelle

Tags und Links