2014-01-10 2 views
9

Ich entwickle eine Client/Server-Anwendung mit TLS. Meine Idee ist, ein Zertifikat auf dem Client zu verwenden, damit es vom Server authentifiziert wird. Auch ein anderes Zertifikat auf dem Server, so dass der Client auch authentifizieren kann, dass er sich mit dem richtigen Server verbindet.Testen der SSL/TLS-Client-Authentifizierung mit OpenSSL

Ich möchte zuerst openssl s_server und openssl s_client testen und verwenden, um den Vorschlag zu validieren.

Bis jetzt habe ich einen privaten CA-Schlüssel auf dem Server erstellt, ich habe ein Stammzertifikat erstellt. Mit dem Root-Zertifikat habe ich zwei CSR unterschrieben, also bekomme ich ein Zertifikat für den Server und ein Zertifikat für den Client.

Ich habe auch das Client-Zertifikat + Stammzertifikat auf dem Client und das Serverzertifikat + Stammzertifikat auf dem Server installiert.

Ich möchte jetzt versuchen, eine Verbindung zwischen openssl s_server und openssl s_client herzustellen und zu überprüfen, dass sie beide gegenseitig authentifiziert werden, aber ich kann nicht meine Meinung mit der Dokumentation, wie es geht. Irgendwelche Hilfe oder irgendeine Anleitung dazu?

Sobald ich das eingerichtet habe, ist der nächste Schritt, den eigenen entwickelten Client gegen diesen Server und unseren eigenen entwickelten Server gegen den s_client zu testen. Können wir das zum Testen verwenden?

Dank

Antwort

16

Es ist wie Sie mit (1) s_client und s_server zum Testen eine Wurzel des Vertrauens versuchen einzurichten sieht; und (2) programmgesteuert in Ihrem Code mit OpenSSL.


Um sicherzustellen, openssl s_client (oder openssl s_server) verwendet Ihre Wurzel, verwenden Sie die folgenden Optionen:

  • -CAfile Option, um die Wurzel für das Zertifikat
  • -cert Option geben
  • -key Option zu verwenden, für den privaten Schlüssel des Zertifikats

Weitere Informationen finden Sie in den Dokumenten unter s_client(1) und s_server(1).


die gleiche programmatisch auf dem Client zu tun, verwenden Sie:

  • SSL_CTX_load_verify_locations den vertrauenswürdigen Stamm
  • SSL_CTX_use_certificate zu laden, den privaten Schlüssel angeben, legen Sie das Client-Zertifikat
  • SSL_CTX_use_PrivateKey zu für das Kundenzertifikat

die gleichen programmatisch auf dem Server zu tun, verwenden Sie:

  • SSL_CTX_load_verify_locations den vertrauenswürdigen Stamm zu laden
  • SSL_CTX_use_certificate_chain_file geben Sie das Server-Zertifikat
  • SSL_CTX_use_PrivateKey die privaten Schlüssel für das Serverzertifikat zu laden
  • SSL_CTX_set_client_CA_list dem Client zu sagen, sein Client-Zertifikat

Wenn Sie die Parameter verwenden mögen, nicht senden jede Verbindung (d.h. den allgemeinen Kontext), und legen Sie dann für jede SSL-Verbindung z. B. SSL_use_certificate und SSL_use_PrivateKey fest.

Eine Menge geht weiter mit SSL_CTX_set_client_CA_list. Es (1) lädt die Zertifizierungsstellen, die der Server verwendet, um einen Client zu verifizieren, (2) es veranlasst den Server, eine Liste von CAs zu senden, die es akzeptiert, wenn ein Client überprüft wird, und (3) es löst die Nachricht ClientCertificate auf dem Client aus Der Client verfügt über ein Zertifikat, das die akzeptierte CAs-Liste des Servers erfüllt.

Siehe auch die Dokumente auf SSL_CTX_load_verify_locations(3), SSL_CTX_use_certificate(3), SSL_CTX_set_client_CA_list und Freunde.


Das am einfachsten zu verwendende Zertifikat- und Schlüsselformat ist PEM. PEM verwendet beispielsweise ----- BEGIN CERTIFICATE -----. Stellen Sie für das Serverzertifikat sicher, dass die Datei eine Verkettung des Serverzertifikats und aller Zwischenprodukte ist, die der Client zum Erstellen der Kette benötigt.

Wenn der Server alle erforderlichen Zertifikate sendet, ist dies die übliche Vorgehensweise für ein Problem, das als "das Verzeichnis" -Problem bekannt ist. Es ist ein bekanntes Problem in der PKI, und es ist im Wesentlichen das Problem, dass Clients nicht wissen, wohin sie gehen müssen, um fehlende Zwischenzertifikate zu holen.


Im Allgemeinen kennen Sie jetzt die Funktionen, die Sie verwenden müssen. Laden Sie einen kleinen Server wie nginx herunter und sehen Sie, wie ein Produktionsserver sie in der Praxis verwendet. Sie könnten sogar einen SQL-Server wie Postgres verwenden, da dieser einen SSL/TLS-Server einrichtet. Suchen Sie einfach die Quelldateien nach SSL_CTX_load_verify_locations oder SSL_load_verify_locations, und Sie werden den richtigen Ort finden.

Obwohl ich es nicht empfehlen, können Sie sogar s_client.c und s_server.c betrachten. Sie befinden sich in <openssl dir>/apps. Aber der Code kann manchmal schwierig zu lesen sein.