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.