[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Eigene CA



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

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: