Sowas hätte ich gerne für meine Entwicklungsumgebung unter OS X, um für die Entwicklungsumgebung mit ihren verschiedenen *.local.web Domains SSL Zertifikate erstellen zu können. Ausserdem ist es mal spannend zu sehen wie so eine CA aufgebaut wird.
Als Zertifizierungsstelle (CA) zu fungieren bedeutet, mit kryptographischen Paaren aus privaten Schlüsseln und öffentlichen Zertifikaten umzugehen. Das allererste kryptographische Paar, das ich erstelle, ist das Root-Paar. Dieses besteht aus
dem Wurzelschlüssel - ca.key.pem
und dem Wurzelzertifikat - ca.cert.pem
Dieses Paar bildet die Identität der CA.
Normalerweise signiert die Root-CA Server- oder Client-Zertifikate nicht direkt. Die Root-CA wird immer nur dazu verwendet, eine oder mehrere Zwischen-CAs zu erstellen, denen die Root-CA vertraut, Zertifikate in ihrem Namen zu signieren. Das ermöglicht, den Root-Schlüssel offline und so weit wie möglich unbenutzt zu halten, da jede Kompromittierung des Root-Schlüssels katastrophal ist. Es ist bewährte Praxis, das Wurzelpaar in einer sicheren Umgebung zu erstellen. Idealerweise sollte das auf einem vollständig verschlüsselten Computer geschehen, der permanent vom Internet getrennt ist.
Falls openSSL noch nicht installiert ist sollte ich das jetzt machen:
…und darin eine Zertifizierungsstelle und ein Stammzertifikat erstellen.
certs - Hier liegt der Public Key der Zertifikatsstelle
crl -certificate revocation list - Eine Liste, die die Ungültigkeit von Zertifikaten
beschreibt. Sie ermöglicht es, festzustellen, ob ein Zertifikat gesperrt oder widerrufen wurde und warum.
private - Hier liegt der private Schlüssel der CA
csr - Hier liegen die Anfragen?
Weitere Dateien, die OpenSSL zur Erstellung von Zertifikaten benötigt:
serial - Das File speichert die zuletzt vergebene eindeutige Seriennummer. Die Hexadezimalzahl muss mindestens zwei Stellen haben.
index.txt - Das File listet die von der CA ausgestellten Zertifikate.
Ein langes, komplexes Passwort in die Datei passwort.txt schreiben und speichern:
Die Datei mit einem kürzeren und besser merkbaren Passwort verschlüsseln (TODO wird momentan nicht benutzt):
Die verschlüsselte Datei kontrollieren:
Zur Kontrolle das lange Passwort nochmal entschlüsseln
und dann die nicht verschlüsselte Datei mit rm -f passwort.txt löschen.
Eine benutzerdefinierte OpenSSL-Konfiguration (openssl.cnf) erstellen, die für die Erstellung einer Zertifizierungsstelle (Root-SSL-Zertifikat) geeignet ist.
Der Abschnitt [ ca ] ist obligatorisch. Hier weisen wir OpenSSL an, die Optionen aus der Sektion [ CA_default ] zu verwenden.
Der Abschnitt [ CA_default ] enthält eine Reihe von Standardeinstellungen. Stelle sicher, dass du das Verzeichnis deklarierst, das du zuvor gewählt hast (/usr/local/opt/ca).
Wende policy_strict für alle Root-CA-Signaturen an, da die Root-CA nur zur Erstellung von Zwischen-CAs verwendet wird.
Wende policy_loose für alle Zwischen-CA-Signaturen an, da die Zwischen-CA Server- und Client-Zertifikate signiert, die von einer Vielzahl von Drittanbietern stammen können.
Optionen aus dem Abschnitt [ req ] werden bei der Erstellung von Zertifikaten oder Zertifikatssignierungsanforderungen angewendet.
Der Abschnitt [ req_distinguished_name ] deklariert die Informationen, die normalerweise in einer Zertifikatsunterzeichnungsanforderung erforderlich sind. Gib optional einige Standardwerte an.
Die nächsten Abschnitte sind Erweiterungen, die beim Signieren von Zertifikaten angewendet werden können. Wenn du beispielsweise das Befehlszeilenargument -extensions v3_ca übergibst, werden die in [ v3_ca ] festgelegten Optionen angewendet. Ich wende die Erweiterung v3_ca an, wenn ich das Stammzertifikat erstelle.
Ich wende die Erweiterung v3_ca_intermediate an, wenn ich das Zwischenzertifikat erstelle. pathlen:0 stellt sicher, dass es keine weiteren Zertifizierungsstellen unterhalb der Zwischen-CA geben kann.
Ich wende die Erweiterung usr_cert an, wenn ich Client-Zertifikate signiere, wie sie z.B. für die Remote-Benutzerauthentifizierung verwendet werden.
Ich wende die Erweiterung server_cert beim Signieren von Server-Zertifikaten, wie sie beispielsweise für Webserver verwendet werden, an.
Die Erweiterung crl_ext wird bei der Erstellung von Zertifikatswiderrufslisten automatisch angewendet.
Ich wende die ocsp - Erweiterung bei der Unterzeichnung des OCSP-Zertifikats (Online Certificate Status Protocol) an.
1.) Einen privaten Schlüssel erzeugen. Alle Zertifikate werden mit einem Passwort verschlüsselt. Ich setze hier mypassword ein. Bitte das lange Passwort von oben nehmen.
Wichtig: Ein Backup des privaten Schlüssels machen (und gut sichern, zB. auf einem USB-Stick). Wenn der verloren geht, ist das SSL-Zertifikat wertlos.
2.) Einen Certificate Signing Request (CSR) erzeugen:
Das CA-Zertifikat entspricht dem „Public Key“ der Zertifizierungsstelle.
-key - Der zum künftigen Zertifikat gehörende private Schlüssel
-out - Der Name des künftigen Zertifikats
-x509 - Erstellt ein selbstsigniertes Zertifikat, anstelle einer gewöhnlichen Zertifikats-Anfrage
Das Zertifikat ist 7300 Tage - also 20 Jahre - gültig
-extensions v3_ca - Die Einstellungen aus der Datei openssl.cnf unter dem Abschnitt v3_ca a werden berücksichtigt.
Eine Konfigurationsdatei für die Zwischenstelle einrichten:
1.) Den privaten Schlüssel für die Intermediate-CA erstellen. Wird später fürs elektronische Signieren der ausgestellten Zertifikate benutzt:
2.) Einen Certificate Signing Request (CSR) erzeugen:
Den erzeugten CSR würde ich jetzt normalerweise an eine offizielle Zertifizierungsstelle übermitteln bzw. hochladen. Ich mache das aber selbst, und nutze wie oben meine eigene CA dafür:
3.) CSR für Intermediate-CA-Zertifikat mit Root-CA signieren.
Ich unterzeichne den CSR mit der eigenen Root-CA . Das Zertifikat ist 3650 Tage - also rund 10 Jahren gültig.
In der index.txt im Root-CA-Verzeichnis nachschauen, und das Zertifikat ansehen:
4.) Zertifikatskette erstellen.
Die Zertifikatskette / Certificate-Chain besteht aus den aneinander gehängten einzelnen Zertifikaten, das unterste der Hierarchie steht zuerst in der Datei, das oberste - also die Root-CA als letztes.
E: SSL-Zertifikat für den Entwicklungsserver erstellen#
Als letztes erstellen wir das SSL-Zertifikat für den Entwicklungsserver, und kopieren alles nach /usr/local/etc/httpd/ssl.
1.) Den privaten Schlüssel für *.local.web erzeugen:
2.) Einen Certificate Signing Request (CSR) für *.local.web erzeugen:
Den erzeugten CSR würde ich jetzt normalerweise an eine offizielle Zertifizierungsstelle übermitteln bzw. hochladen. Ich mache das aber selbst, und nutze meine eigene CA dafür:
3.) Den CSR mit dem Intermediate-CA-Zertifikat signieren
1835 Tage gültig - also ca. 5 Jahre
4.) und alles kopieren…
Die Zertifikatskette, …
…den Schlüssel, …
Erzeugt aus der mit Passwort geschützten Schlüsseldatei local.web.key.pem eine Schlüsseldatei ohne Passwortschutz local.web.key. Die ungeschützte Schlüsseldatei muss vor unbefugtem Zugriff geschützt werden, zB. über Dateizugriffsrechte.
…und das Zertifikat…
Bis hierhin hat das super funktioniert. Jetzt will ich das Ganze natürlich noch im Apache aktivieren und nutzen.