Michelle Konzack schrieb:
Beruflich bedingt, sind Verisign & Co als untrusted deklariert.
Was an sich nicht weiter tragisch ist - denn der Wert von Verisign und
ähnlichen komerziellen Anbietern ist doch eher fraglich, wenn man
bedenkt, was so ein Zertifikat aussagt. Schick sind die, weil sie in den
meisten Browsern und Anwendungen mit dabei sind und man als User keine
'dummen Fragen' zu Gesicht bekommt.
Nun ist es so, das wir in Paris einen speziellen Server aufbauen
müssen, der die CA übernimmt.
2) Was benötigen wir als Software?
OpenSSL :-) Das ist eigentlich schon alles was Du wirklich brauchst.
1) Wie macht man sowas ?
<Märchenstunde an>
Zuerst solltest Du/Ihr ein paar Fragen klären, dann schreib ich meinen
groben Notizzettel für OpenSSL ab:
- wer soll und darf signiern?
- wie lange sollen die Zertifikate gültig sein?
- nach welchen Reglen werden die Requests verglichen?
- wie wird der CA Recher physikalisch und personell geschützt?
- braucht es verschiedene 'Sicherheitsstufen'?
- wie werden CRLs verteilt?
- etc.
(also mit anderen Worten über die Infrastruktur sollte man schon
einen Moment lang nachdenken, vielleicht auch zwei...)
Hier ein Ausschnitt aus meinem Anwendungsfall:
1) OpenSSL installieren.
1a) Überlegt, ich brauche zwei CAs für zwei verschiendene Anwendungen.
Die erste sollte für Benutzer zuständig sein und Zertifikate
erstellen, die mit Passwort später noch geschützt sind. Die zweite
dient nur für Server-Zertifikate, die später meist ja ohne Passwort
auskommen müssen (und sind daher auch nicht so lange gültig)
1b) Später zeigte sich, dass die beiden CAs von unterschiedlichen
Personen weitergepflegt wurden - also kam noch eine Root-CA dazu,
die die beiden anderen CAs zertifiziert. Wenn man das nicht alles
selbst machen will, der DFN und auch andere bieten die
Zertifizierung zur CA an, solange man eine Richtline und
Verfahrensweisen vorlegen kann.
1c) War alles zu teuer, also selbst loslegen...
2) /etc/ssl/openssl.cnf editieren
2a) HOME auf etwas sinnvolles ändern, /home/CA z.B. weil ich das nicht
so gern hab, dass die ganzen CA Sachen unter /usr/lib... liegen.
Aber reine Geschmackssache.
2b) etwas weiter unten kommt der Abschnitt [ ca ], dort kann man eine
Voreinstellung für die zu verwendende CA angeben, bei mir
BenutzerCA.
2c) direkt darunter steht ein Block für eine CA (wenn ich mich recht
erinnere...), diesen durchlesen und alles anpassen was für den
eigenen Gebrauch wichtig ist. Und alles verstehen, was dort
an Optionen auftaucht (OpenSSL Hanbuch ist an dieser Stelle
fast Pflicht). Bei mir wieder ist der Pfad angepasst auf meinen.
Aus diesem Abschnitt baue ich mir insgesammt drei Blöcke:
[ RootCA ]
[ BenutzerCA ]
[ DiensteCA ]
Irgendwo ist ein Abschnitt usr_ca zu finden, dieser ist für die
'User'-Zertifikate (Benutzer und Server zuständig), ich brauche
noch einen zweiten für das Signieren der zwei weiteren CAs:
Dazu erstelle ich einen zusätzlichen Abschnitt [ ca_cert ] und
ändere basicConstraints auf CA:true.
Die [ RootCA ] bekommt bei x509_extensions dann ca_cert und die
beiden anderen usr_cert.
2d) Hoffe hab jetzt an alles gedacht (mal so eben aus dem Kopf)
3) mkdir /home/CA/RootCA
mkdir /home/CA/RootCA/private
cd /home/CA/RootCA/private
3a) openssl genrsa -aes256 -out RootCA.key.pem 2048
(erzeugt einen 2048 Bit Schlüssel, hier sollte man ein SEHR gutes
Passwort wählen und es gut unter Verschluss halten),
3b) openssl req -new -x509 -days 3650 -key RootCA.key.pem
-out ../RootCA.cert.pem
(erzeugt ein selbstsigniertes Zertifikat für die RootCA)
3c) openssl x509 -in ../RootCA.cert.pem -text
(alles nochmal genau durchlesen und prüfen)
3d) Das Zertifikat und der Schlüssel müssen genau den gleichen Namen
haben, wie es in der openssl.cnf angegeben ist! Überprüfen und
notfalls entsprechend umbenennen/kopieren.
3e) cd /home/CA/RootCA
cp RootCA.cert.pem certs/00.pem
cd certs/
ln -s 00.pem `openssl x509 -hash -noout -in 00.pem`.0
(das erzeugt quasi eine Verwaltung für die Zertifikate, das
erstellen des Symlinks mit dem Hashwert hat manchmal gute Dienste
geleistet, wenn man das Zertifikat nochmal wiederfinden muss)
4) Erstellen der Verzeichnisse wie bei 3) nur für die BenutzerCA und
die DiensteCA.
4a) die 3a) nur auch wieder für die beiden anderen CAs
4b) openssl req -new -key BenutzerCA.key.pem -out ../BenutzerCA.req.pem
(einen Request erzeugen)
4c) BenutzerCA.req.pem muss nur irgenwie zur RootCA kommen zum Signieren
(da bei mir alles lokal läuft einfach umkopiert in ein extra
Verzeichnis)
4d) openssl ca -name RootCA -in DiensteCA.req.pem
-out DiensteCA.cert.pem
Dies wählt die RootCA aus und zertifiziert den Request, und das
Zertifikat landet in RootCA/newcerts (sollte man vorher alles
angelegt haben, so wie es in der openssl.cnf steht)
4e) mv /home/CA/RootCA/newcerts/??.pem /home/CA/RootCA/certs/
cd /home/CA/RootCA/certs/
ln -s ??.pem `openssl x509 -in ??.pem -hash -noout`.0
4f) DiensteCA.cert.pem muss natürlich zurück an die DiensteCA in deren
Homeverzeichnis. Das gleich dann bei mir z.B. noch für die
BenutzerCA.
5) Hurra! 3 CAs erstellt :-)
6) Requests von anderen signieren - aber mit BenutzerCA oder DiensteCA,
keinesfalls mit der RootCA.
7) Tipp: Anwendungen die manchmal ein .crt brauchen, wollen in der Regel
nur den Block aus dem .cert.pem der zwischen ---BEGIN...--- und
---END...--- steht, einfach rauskopieren und abspeichern (das nutze
ich für meinen Apache so zum Ausliefern an die Clients).
8) CRL muss ich nochmal suchen, die Notizen hab ich gerade nicht zur
Hand, liegen noch bei meinem Arbeitgeber.
Hoffe mal, das war halbwegs verständlich ;-) Wenn die CAs
'funktionieren' dann könnte ein beispielhafter Ablauf so aussehen:
Anwender:
- openssl genrsa -out apache.key.pem -rand ./private/.rand 2048
- openssl req -new -key apache.key.pem -out apache.req.pem
- schickt apache.req.pem an die CA (hier z.B. DiensteCA, müssen ja nicht
in einem Hause sein und schon gar nicht auf einen Rechner)
DiensteCA:
- kopiert apache.req.pem in ein Verzeichnis
- openssl ca -name DiensteCA -in apache.req.pem -out apache.cert.pem
- mv newcerts/??.pem certs/
- cd certs
- ln -s ??.pem `openssl x509 -hash -noout -in ??.pem`.0
- schickt apache.cert.pem zurück an den Anwender
(- stellt auch die eigenen Zertifikate zur Verfügung, also
DiensteCA.cert.pem, damit der Anwender der Zertifikat auch vergleichen
kann, gleiches gilt für die anderen CAs)
Anwender:
- kopiert apache.cert.pem und apache.key.pem an die entsprechnenden
Stellen
- besorgt sich die nötigen CA Zertifikate zum Vergleich
- ist hoffentlich glücklich
</Märchenstunde aus>
Es gibt mit OpenSSL dabei ein paar Skripte, die einem das Leben etwas
vereinfachen sollen - ich find's zu Fuß nicht so tragisch zu meistern,
viel aufwändiger ist das Erarbeiten einer Richtline und das einhalten
derselben. Und das Pflegen der CRLs. Und das Sichern des Rechners (z.B.
ist er allein und nicht im Netzwerk etc.)
HTH und bedanke mich nochmal bei allen, die mir damals mit dem ganzen
Kram geholfen haben. Bisher läuft's super ;-)
Cheers,
Jan