Lassen Sie mich mit einem Beispiel erklären.
In der normalen Schlüsselpaar-basierten PKI gibt es einen privaten Schlüssel und einen öffentlichen Schlüssel.
In einem zertifikatbasierten System gibt es einen privaten Schlüssel und ein Zertifikat. Das Zertifikat enthält mehr Informationen als der öffentliche Schlüssel.
Demo (Sie können ein Zertifikat und einen privaten Schlüssel erstellen): http://www.selfsignedcertificate.com/
Sie können die Datei mit dem privaten Schlüssel und das Zertifikat herunterladen. Sie sehen, dass die Zertifikatdatei viele Informationen enthält, wie unten gezeigt.
Sie können Ihr generiertes Zertifikat (das mit einem Texteditor geöffnet wird) und Ihren privaten Schlüssel (das mit einem Texteditor geöffnet wird) auf dieser Website abgleichen : https://www.sslshopper.com/certificate-key-matcher.html
Wenn das Zertifikat mit dem privaten Schlüssel des Clients übereinstimmt, ist der Client sicher, dass das Zertifikat vom Client oder vom Trusted Agent (CA) des Clients bereitgestellt wird.
Es gibt jedoch Probleme nur bei der Kommunikation mit privaten Schlüsseln und Zertifikaten .
Da jeder sein eigenes Zertifikat und seinen eigenen privaten Schlüssel generieren kann, beweist ein einfacher Handshake nichts über den Server, außer dass der Server den privaten Schlüssel kennt, der mit dem öffentlichen Schlüssel des Zertifikats übereinstimmt. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, dass der Client über ein oder mehrere Zertifikate verfügt, denen er vertraut. Befindet sich das Zertifikat nicht im Set, ist der Server nicht vertrauenswürdig .
Dieser einfache Ansatz hat mehrere Nachteile. Server sollten in der Lage sein, mit der Zeit ein Upgrade auf stärkere Schlüssel durchzuführen ("Schlüsselrotation"), wodurch der öffentliche Schlüssel im Zertifikat durch einen neuen ersetzt wird. Leider muss jetzt die Client-App aktualisiert werden, da es sich im Wesentlichen um eine Änderung der Serverkonfiguration handelt. Dies ist besonders problematisch, wenn der Server nicht unter der Kontrolle des App-Entwicklers steht, z. B. wenn es sich um einen Webdienst eines Drittanbieters handelt. Dieser Ansatz hat auch Probleme, wenn die App mit beliebigen Servern wie einem Webbrowser oder einer E-Mail-App kommunizieren muss.
Um diese Nachteile zu beheben, werden Server in der Regel mit Zertifikaten bekannter Aussteller konfiguriert, die als Certificate Authorities (CAs) bezeichnet werden. Die Host-Plattform (Client) enthält im Allgemeinen eine Liste bekannter CAs, denen sie vertraut. Ähnlich wie ein Server verfügt eine Zertifizierungsstelle über ein Zertifikat und einen privaten Schlüssel. Bei der Ausstellung eines Zertifikats für einen Server signiert die Zertifizierungsstelle das Serverzertifikat mit ihrem privaten Schlüssel. Der Client kann dann überprüfen, ob der Server über ein Zertifikat verfügt, das von einer der Plattform bekannten Zertifizierungsstelle ausgestellt wurde.
Bei der Lösung einiger Probleme führt die Verwendung von Zertifizierungsstellen jedoch zu einer anderen. Da die Zertifizierungsstelle Zertifikate für viele Server ausstellt, müssen Sie dennoch sicherstellen, dass Sie mit dem gewünschten Server kommunizieren. Um dies zu beheben, identifiziert das von der Zertifizierungsstelle ausgestellte Zertifikat den Server entweder mit einem bestimmten Namen wie gmail.com oder einer Gruppe von Hosts mit Platzhalterzeichen wie * .google.com.
Das folgende Beispiel wird diese Konzepte etwas konkreter machen. Im folgenden Snippet von einer Befehlszeile aus werden mit dem Befehl s_client des openssl-Tools die Serverzertifikatsinformationen von Wikipedia angezeigt. Es gibt Port 443 an, da dies der Standard für HTTPS ist. Der Befehl sendet die Ausgabe von openssl s_client an openssl x509, das Informationen zu Zertifikaten gemäß dem X.509-Standard formatiert. Insbesondere fragt der Befehl nach dem Betreff, der die Servernameninformationen enthält, und dem Aussteller, der die Zertifizierungsstelle identifiziert.
$ openssl s_client -connect wikipedia.org:443 | openssl x509 -noout -subject -issuer
subject= /serialNumber=sOrr2rKpMVP70Z6E9BT5reY008SJEdYv/C=US/O=*.wikipedia.org/OU=GT03314600/OU=See www.rapidssl.com/resources/cps (c)11/OU=Domain Control Validated - RapidSSL(R)/CN=*.wikipedia.org
issuer= /C=US/O=GeoTrust, Inc./CN=RapidSSL CA
Sie können sehen, dass das Zertifikat für Server ausgestellt wurde, die mit * .wikipedia.org von der RapidSSL-Zertifizierungsstelle übereinstimmen.
Wie Sie sehen, kann der Client aufgrund dieser zusätzlichen Informationen, die von CA an Server gesendet werden, leicht erkennen, ob er mit seinem Server kommuniziert oder nicht.